diff --git a/demo-service/pom.xml b/demo-service/pom.xml index f7e316b..bd1c77b 100644 --- a/demo-service/pom.xml +++ b/demo-service/pom.xml @@ -64,6 +64,14 @@ mysql-connector-j runtime + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + org.springframework.boot spring-boot-starter-test diff --git a/demo-service/src/main/resources/application.yml b/demo-service/src/main/resources/application.yml index d022971..d06d3d2 100644 --- a/demo-service/src/main/resources/application.yml +++ b/demo-service/src/main/resources/application.yml @@ -20,7 +20,7 @@ spring: max-lifetime: 900000 jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: false properties: hibernate: @@ -29,6 +29,11 @@ spring: time-zone: UTC serialization: write-dates-as-timestamps: false + flyway: + enabled: true + baseline-on-migrate: true + baseline-version: 0 + locations: classpath:db/migration jwt: secret: ${XUQM_JWT_SECRET:xuqm-tenant-service-secret-key-must-be-at-least-256-bits-long-for-hmac} diff --git a/demo-service/src/main/resources/db/migration/V1__init.sql b/demo-service/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..bb309df --- /dev/null +++ b/demo-service/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,11 @@ +CREATE TABLE IF NOT EXISTS demo_user ( + id VARCHAR(36) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + password_hash VARCHAR(128) NOT NULL, + nickname VARCHAR(64), + avatar VARCHAR(512), + gender VARCHAR(16), + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uq_demo_user_appkey_userid (app_key, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/file-service/pom.xml b/file-service/pom.xml index 6a61df6..72fead2 100644 --- a/file-service/pom.xml +++ b/file-service/pom.xml @@ -59,6 +59,14 @@ mysql-connector-j runtime + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + org.springframework.boot spring-boot-starter-test diff --git a/file-service/src/main/resources/application.yml b/file-service/src/main/resources/application.yml index 4dff08c..a42ffa4 100644 --- a/file-service/src/main/resources/application.yml +++ b/file-service/src/main/resources/application.yml @@ -20,7 +20,7 @@ spring: max-lifetime: 900000 jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: false properties: hibernate: @@ -34,6 +34,11 @@ spring: time-zone: UTC serialization: write-dates-as-timestamps: false + flyway: + enabled: true + baseline-on-migrate: true + baseline-version: 0 + locations: classpath:db/migration jwt: secret: ${XUQM_JWT_SECRET:xuqm-tenant-service-secret-key-must-be-at-least-256-bits-long-for-hmac} diff --git a/file-service/src/main/resources/db/migration/V1__init.sql b/file-service/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..3225af1 --- /dev/null +++ b/file-service/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS file_record ( + id VARCHAR(36) NOT NULL PRIMARY KEY, + hash VARCHAR(64) NOT NULL, + original_name VARCHAR(255), + mime_type VARCHAR(128), + size BIGINT NOT NULL, + ext VARCHAR(16), + storage_path VARCHAR(512) NOT NULL, + thumbnail_path VARCHAR(512), + thumbnail_size BIGINT NOT NULL, + created_at DATETIME(6) NOT NULL, + last_accessed_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_file_record_hash (hash) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/im-service/pom.xml b/im-service/pom.xml index b3b8e6b..9b8a821 100644 --- a/im-service/pom.xml +++ b/im-service/pom.xml @@ -71,6 +71,14 @@ mysql-connector-j runtime + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + org.springframework.boot spring-boot-starter-test diff --git a/im-service/src/main/resources/application.yml b/im-service/src/main/resources/application.yml index 64ed40b..8ad9056 100644 --- a/im-service/src/main/resources/application.yml +++ b/im-service/src/main/resources/application.yml @@ -17,7 +17,7 @@ spring: max-lifetime: 900000 jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: false properties: hibernate: @@ -38,6 +38,11 @@ spring: time-zone: UTC serialization: write-dates-as-timestamps: false + flyway: + enabled: true + baseline-on-migrate: true + baseline-version: 0 + locations: classpath:db/migration jwt: secret: ${XUQM_JWT_SECRET:xuqm-tenant-service-secret-key-must-be-at-least-256-bits-long-for-hmac} diff --git a/im-service/src/main/resources/db/migration/V1__init.sql b/im-service/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..8ef3cad --- /dev/null +++ b/im-service/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,195 @@ +CREATE TABLE IF NOT EXISTS im_account ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + nickname VARCHAR(64), + gender VARCHAR(16), + avatar VARCHAR(512), + admin BIT(1) NOT NULL, + status VARCHAR(16) NOT NULL, + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_im_account_app_user (app_key, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_blacklist ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + blocked_user_id VARCHAR(128) NOT NULL, + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_im_blacklist (app_key, user_id, blocked_user_id), + INDEX idx_blacklist_app_user (app_key, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_conversation_state ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + target_id VARCHAR(128) NOT NULL, + chat_type VARCHAR(16) NOT NULL, + pinned BIT(1) NOT NULL, + muted BIT(1) NOT NULL, + hidden BIT(1) NOT NULL, + draft TEXT, + conversation_group VARCHAR(64), + last_read_at DATETIME(6), + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_im_conv_state (app_key, user_id, target_id, chat_type), + INDEX idx_conv_state_app_user (app_key, user_id), + INDEX idx_conv_state_app_target (app_key, target_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_friends ( + id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + friend_id VARCHAR(128) NOT NULL, + friend_group VARCHAR(64), + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_im_friends (app_key, user_id, friend_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_friend_request ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + from_user_id VARCHAR(128) NOT NULL, + to_user_id VARCHAR(128) NOT NULL, + remark VARCHAR(256), + status VARCHAR(16) NOT NULL, + created_at DATETIME(6) NOT NULL, + reviewed_at DATETIME(6), + UNIQUE KEY uk_im_friend_request (app_key, from_user_id, to_user_id), + INDEX idx_friend_request_app_to (app_key, to_user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_global_mute ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + enabled BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_im_global_mute_app (app_key) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_group ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + name VARCHAR(128) NOT NULL, + group_type VARCHAR(16), + creator_id VARCHAR(128) NOT NULL, + member_ids TEXT NOT NULL, + admin_ids TEXT NOT NULL, + announcement TEXT, + member_info TEXT, + ext_attributes TEXT, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_group_join_request ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + group_id VARCHAR(64) NOT NULL, + requester_id VARCHAR(128) NOT NULL, + remark VARCHAR(256), + status VARCHAR(16) NOT NULL, + created_at DATETIME(6) NOT NULL, + reviewed_at DATETIME(6), + INDEX idx_group_join_request_app_group (app_key, group_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_group_mute ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + group_id VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + muted_until DATETIME(6), + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_im_group_mute (group_id, user_id), + INDEX idx_group_mute_group_user (group_id, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_message ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + from_user_id VARCHAR(128) NOT NULL, + to_id VARCHAR(128) NOT NULL, + chat_type VARCHAR(16) NOT NULL, + msg_type VARCHAR(16) NOT NULL, + content TEXT NOT NULL, + status VARCHAR(16) NOT NULL, + mentioned_user_ids VARCHAR(128), + edited_at DATETIME(6), + created_at DATETIME(6) NOT NULL, + INDEX idx_app_from (app_key, from_user_id), + INDEX idx_app_to (app_key, to_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_offline_message ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(64) NOT NULL, + message_id VARCHAR(64) NOT NULL, + delivered BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_operation_log ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + operator_id VARCHAR(128) NOT NULL, + action VARCHAR(64) NOT NULL, + resource_type VARCHAR(64) NOT NULL, + resource_id VARCHAR(128), + detail TEXT, + created_at DATETIME(6) NOT NULL, + INDEX idx_op_log_app_time (app_key, created_at), + INDEX idx_op_log_app_operator (app_key, operator_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_keyword_filter ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + pattern VARCHAR(512) NOT NULL, + replacement VARCHAR(128), + action VARCHAR(16) NOT NULL, + enabled BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_webhook_alert ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + webhook_id VARCHAR(64) NOT NULL, + webhook_url VARCHAR(512) NOT NULL, + alert_type VARCHAR(32) NOT NULL, + description VARCHAR(512), + acknowledged BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL, + acknowledged_at DATETIME(6) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_webhook_config ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + url VARCHAR(512) NOT NULL, + secret VARCHAR(256), + enabled BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL, + consecutive_failures INT NOT NULL, + last_failure_at DATETIME(6) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS im_webhook_delivery ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + callback_id VARCHAR(64) NOT NULL, + callback_event VARCHAR(64) NOT NULL, + url VARCHAR(512) NOT NULL, + http_status INT NOT NULL, + response_body VARCHAR(4000), + error_message VARCHAR(4000), + attempt INT NOT NULL, + success BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/license-service/pom.xml b/license-service/pom.xml index d82af97..c00203e 100644 --- a/license-service/pom.xml +++ b/license-service/pom.xml @@ -59,6 +59,14 @@ mysql-connector-j runtime + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + org.springframework.boot spring-boot-starter-test diff --git a/license-service/src/main/resources/application.yml b/license-service/src/main/resources/application.yml index 269fb10..92e6f92 100644 --- a/license-service/src/main/resources/application.yml +++ b/license-service/src/main/resources/application.yml @@ -17,7 +17,7 @@ spring: max-lifetime: 900000 jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: false properties: hibernate: @@ -26,6 +26,11 @@ spring: time-zone: UTC serialization: write-dates-as-timestamps: false + flyway: + enabled: true + baseline-on-migrate: true + baseline-version: 0 + locations: classpath:db/migration jwt: secret: ${XUQM_JWT_SECRET:xuqm-tenant-service-secret-key-must-be-at-least-256-bits-long-for-hmac} diff --git a/license-service/src/main/resources/db/migration/V1__init.sql b/license-service/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..fe2cd37 --- /dev/null +++ b/license-service/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,49 @@ +CREATE TABLE IF NOT EXISTS app_licenses ( + app_key VARCHAR(64) NOT NULL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + android_package_name VARCHAR(128), + ios_bundle_id VARCHAR(128), + harmony_bundle_name VARCHAR(128), + max_devices INT NOT NULL DEFAULT 1, + registered_devices INT NOT NULL DEFAULT 0, + expires_at DATETIME(6), + is_active BIT(1) NOT NULL DEFAULT 1, + remark VARCHAR(500), + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS devices ( + id VARCHAR(36) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + device_id VARCHAR(255) NOT NULL, + device_name VARCHAR(255), + device_model VARCHAR(255), + device_vendor VARCHAR(255), + os_version VARCHAR(255), + user_id VARCHAR(255), + user_name VARCHAR(255), + user_email VARCHAR(255), + user_phone VARCHAR(64), + user_info_json TEXT, + token_hash VARCHAR(512) NOT NULL, + registered_at DATETIME(6) NOT NULL, + last_verified_at DATETIME(6), + is_active BIT(1) NOT NULL DEFAULT 1, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_app_key_device_id (app_key, device_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS license_operation_log ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + operator VARCHAR(128) NOT NULL, + action VARCHAR(64) NOT NULL, + resource_type VARCHAR(64) NOT NULL, + resource_id VARCHAR(128), + summary VARCHAR(255), + detail_json TEXT, + created_at DATETIME(6) NOT NULL, + INDEX idx_license_op_log_app_time (app_key, created_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/push-service/pom.xml b/push-service/pom.xml index cbe5739..6c6cba9 100644 --- a/push-service/pom.xml +++ b/push-service/pom.xml @@ -59,6 +59,14 @@ mysql-connector-j runtime + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + org.springframework.boot spring-boot-starter-test diff --git a/push-service/src/main/resources/application.yml b/push-service/src/main/resources/application.yml index f19a320..c9f741d 100644 --- a/push-service/src/main/resources/application.yml +++ b/push-service/src/main/resources/application.yml @@ -17,8 +17,13 @@ spring: max-lifetime: 900000 jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: false + flyway: + enabled: true + baseline-on-migrate: true + baseline-version: 0 + locations: classpath:db/migration jwt: secret: ${XUQM_JWT_SECRET:xuqm-tenant-service-secret-key-must-be-at-least-256-bits-long-for-hmac} diff --git a/push-service/src/main/resources/db/migration/V1__init.sql b/push-service/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..b3b07bd --- /dev/null +++ b/push-service/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,63 @@ +CREATE TABLE IF NOT EXISTS push_user ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + nickname VARCHAR(64), + gender VARCHAR(16), + avatar VARCHAR(512), + status VARCHAR(16) NOT NULL, + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_push_user (app_key, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS push_device_token ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + vendor VARCHAR(16) NOT NULL, + token VARCHAR(512) NOT NULL, + platform VARCHAR(32), + device_id VARCHAR(128), + brand VARCHAR(64), + model VARCHAR(128), + os_version VARCHAR(64), + app_version VARCHAR(64), + receive_push BIT(1) NOT NULL DEFAULT 1, + last_login_at DATETIME(6), + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_push_device_token (app_key, user_id, device_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS push_device_login_log ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + vendor VARCHAR(16) NOT NULL, + token_hash VARCHAR(128) NOT NULL, + token_preview VARCHAR(128) NOT NULL, + platform VARCHAR(32), + device_id VARCHAR(128) NOT NULL, + brand VARCHAR(64), + model VARCHAR(128), + os_version VARCHAR(64), + app_version VARCHAR(64), + receive_push BIT(1) NOT NULL, + event_type VARCHAR(32) NOT NULL, + created_at DATETIME(6) NOT NULL, + INDEX idx_push_device_log_user_time (app_key, user_id, created_at), + INDEX idx_push_device_log_token (token_hash) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS push_operation_log ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + operator VARCHAR(128) NOT NULL, + action VARCHAR(64) NOT NULL, + resource_type VARCHAR(64) NOT NULL, + resource_id VARCHAR(128), + summary VARCHAR(255), + detail TEXT, + created_at DATETIME(6) NOT NULL, + INDEX idx_push_op_log_app_time (app_key, created_at) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/tenant-service/pom.xml b/tenant-service/pom.xml index 1b3a89f..911aef2 100644 --- a/tenant-service/pom.xml +++ b/tenant-service/pom.xml @@ -76,6 +76,14 @@ mysql-connector-j runtime + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + org.springframework.boot spring-boot-starter-test diff --git a/tenant-service/src/main/resources/application.yml b/tenant-service/src/main/resources/application.yml index 9413743..cad9c3c 100644 --- a/tenant-service/src/main/resources/application.yml +++ b/tenant-service/src/main/resources/application.yml @@ -17,7 +17,7 @@ spring: max-lifetime: 900000 jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: false properties: hibernate: @@ -52,6 +52,11 @@ spring: time-zone: UTC serialization: write-dates-as-timestamps: false + flyway: + enabled: true + baseline-on-migrate: true + baseline-version: 0 + locations: classpath:db/migration jwt: secret: ${XUQM_JWT_SECRET:xuqm-tenant-service-secret-key-must-be-at-least-256-bits-long-for-hmac} diff --git a/tenant-service/src/main/resources/db/migration/V1__init.sql b/tenant-service/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..8f1d306 --- /dev/null +++ b/tenant-service/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,131 @@ +CREATE TABLE IF NOT EXISTS t_tenant ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + username VARCHAR(64) NOT NULL, + password VARCHAR(128) NOT NULL, + email VARCHAR(128) NOT NULL, + nickname VARCHAR(64) NOT NULL, + phone VARCHAR(32), + type VARCHAR(16) NOT NULL, + status VARCHAR(20) NOT NULL, + parent_id VARCHAR(64), + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_t_tenant_username (username), + UNIQUE KEY uk_t_tenant_email (email) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_app ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + tenant_id VARCHAR(64) NOT NULL, + package_name VARCHAR(128) NOT NULL, + ios_bundle_id VARCHAR(128), + harmony_bundle_name VARCHAR(128), + name VARCHAR(128) NOT NULL, + description VARCHAR(512), + icon_url VARCHAR(512), + app_key VARCHAR(64) NOT NULL, + app_secret VARCHAR(128) NOT NULL, + created_at DATETIME(6) NOT NULL, + license_file_content VARCHAR(4096), + is_default BIT(1) DEFAULT 0, + deletable BIT(1) DEFAULT 1, + UNIQUE KEY uk_t_app_app_key (app_key) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_api_key ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + api_key VARCHAR(64) NOT NULL, + name VARCHAR(128), + enabled BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_t_api_key (api_key) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_feature_service ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + platform VARCHAR(16) NOT NULL, + service_type VARCHAR(16) NOT NULL, + enabled BIT(1) NOT NULL, + config TEXT, + secret_key VARCHAR(128) NOT NULL, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_operation_log ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + tenant_id VARCHAR(64) NOT NULL, + module_type VARCHAR(32) NOT NULL, + resource_type VARCHAR(64) NOT NULL, + resource_id VARCHAR(128), + action VARCHAR(64) NOT NULL, + operator VARCHAR(128), + detail_json TEXT, + summary VARCHAR(255), + ip_address VARCHAR(64), + created_at DATETIME(6) NOT NULL, + INDEX idx_t_op_log_tenant_time (tenant_id, created_at), + INDEX idx_t_op_log_tenant_module (tenant_id, module_type) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_email_verification ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + email VARCHAR(128) NOT NULL, + code VARCHAR(16) NOT NULL, + purpose VARCHAR(32) NOT NULL, + used BIT(1) NOT NULL, + expires_at DATETIME(6) NOT NULL, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_migrate_key ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + tenant_id VARCHAR(64) NOT NULL, + key_hash VARCHAR(128) NOT NULL, + created_at DATETIME(6) NOT NULL, + expires_at DATETIME(6) NOT NULL, + used_at DATETIME(6) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_ops_admin ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + username VARCHAR(64) NOT NULL, + password VARCHAR(128) NOT NULL, + created_at DATETIME(6) NOT NULL, + email VARCHAR(128), + last_login_at DATETIME(6), + UNIQUE KEY uk_t_ops_admin_username (username), + UNIQUE KEY uk_t_ops_admin_email (email) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_risk_config ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + ip_rate_limit INT NOT NULL, + login_fail_threshold INT NOT NULL, + login_lock_minutes INT NOT NULL, + abnormal_detection BIT(1) NOT NULL, + updated_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_sensitive_word ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + word VARCHAR(256) NOT NULL, + level VARCHAR(16) NOT NULL, + category VARCHAR(64) NOT NULL, + enabled BIT(1) NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_t_sensitive_word (word) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS t_service_activation_request ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + platform VARCHAR(16) NOT NULL, + service_type VARCHAR(16) NOT NULL, + status VARCHAR(16) NOT NULL, + apply_reason VARCHAR(512), + review_note VARCHAR(512), + created_at DATETIME(6) NOT NULL, + reviewed_at DATETIME(6) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/update-service/pom.xml b/update-service/pom.xml index 240fb9c..eccbea0 100644 --- a/update-service/pom.xml +++ b/update-service/pom.xml @@ -68,6 +68,14 @@ mysql-connector-j runtime + + org.flywaydb + flyway-core + + + org.flywaydb + flyway-mysql + org.springframework.boot spring-boot-starter-test diff --git a/update-service/src/main/resources/application.yml b/update-service/src/main/resources/application.yml index c516b6f..b228d16 100644 --- a/update-service/src/main/resources/application.yml +++ b/update-service/src/main/resources/application.yml @@ -17,12 +17,17 @@ spring: max-lifetime: 900000 jpa: hibernate: - ddl-auto: update + ddl-auto: validate show-sql: false servlet: multipart: max-file-size: 200MB max-request-size: 200MB + flyway: + enabled: true + baseline-on-migrate: true + baseline-version: 0 + locations: classpath:db/migration jwt: secret: ${XUQM_JWT_SECRET:xuqm-tenant-service-secret-key-must-be-at-least-256-bits-long-for-hmac} diff --git a/update-service/src/main/resources/db/migration/V1__init.sql b/update-service/src/main/resources/db/migration/V1__init.sql new file mode 100644 index 0000000..a66eca3 --- /dev/null +++ b/update-service/src/main/resources/db/migration/V1__init.sql @@ -0,0 +1,106 @@ +CREATE TABLE IF NOT EXISTS update_app_version ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + platform VARCHAR(16) NOT NULL, + version_name VARCHAR(32) NOT NULL, + version_code INT NOT NULL, + download_url VARCHAR(512), + change_log TEXT, + force_update BIT(1) NOT NULL, + publish_status VARCHAR(16) NOT NULL, + store_submit_mode VARCHAR(16), + store_submit_scheduled_at DATETIME(6), + app_store_url VARCHAR(256), + market_url VARCHAR(256), + gray_enabled BIT(1) NOT NULL DEFAULT 0, + gray_percent INT NOT NULL DEFAULT 0, + scheduled_publish_at DATETIME(6), + store_submit_targets TEXT, + store_review_status TEXT, + auto_publish_after_review BIT(1) NOT NULL DEFAULT 0, + webhook_url VARCHAR(512), + gray_mode VARCHAR(24) NOT NULL DEFAULT 'PERCENT', + gray_member_ids TEXT, + gray_group_names TEXT, + extra_member_ids TEXT, + pending_store_publish_type VARCHAR(16), + pending_store_publish_scheduled_at DATETIME(6), + pending_store_publish_updated_at DATETIME(6), + package_name VARCHAR(256), + apk_hash VARCHAR(64), + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS update_publish_config ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + config_json TEXT, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_update_publish_config_app (app_key) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS update_store_config ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + store_type VARCHAR(16) NOT NULL, + config_json TEXT, + enabled BIT(1) NOT NULL DEFAULT 1, + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_update_store_config (app_key, store_type) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS update_gray_member ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + name VARCHAR(128), + source VARCHAR(16) NOT NULL DEFAULT 'SYNC', + active BIT(1) NOT NULL DEFAULT 1, + extra_json VARCHAR(512), + updated_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_update_gray_member (app_key, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS update_gray_tag ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + tag_name VARCHAR(64) NOT NULL, + user_id VARCHAR(128) NOT NULL, + created_at DATETIME(6) NOT NULL, + UNIQUE KEY uk_update_gray_tag (app_key, tag_name, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS update_rn_bundle ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + module_id VARCHAR(64) NOT NULL, + platform VARCHAR(16) NOT NULL, + version VARCHAR(32) NOT NULL, + bundle_url VARCHAR(512) NOT NULL, + md5 VARCHAR(64) NOT NULL, + min_common_version VARCHAR(32), + package_name VARCHAR(256), + note VARCHAR(512), + publish_status VARCHAR(16) NOT NULL, + publish_mode VARCHAR(16), + scheduled_publish_at DATETIME(6), + gray_enabled BIT(1) NOT NULL DEFAULT 0, + gray_percent INT NOT NULL DEFAULT 0, + gray_mode VARCHAR(24) NOT NULL DEFAULT 'PERCENT', + gray_member_ids TEXT, + gray_group_names TEXT, + extra_member_ids TEXT, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE IF NOT EXISTS update_operation_log ( + id VARCHAR(255) NOT NULL PRIMARY KEY, + app_key VARCHAR(64) NOT NULL, + resource_type VARCHAR(32) NOT NULL, + resource_id VARCHAR(64) NOT NULL, + action VARCHAR(32) NOT NULL, + operator VARCHAR(128), + reason VARCHAR(1024), + detail_json TEXT, + created_at DATETIME(6) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;