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;