From 37f2b556e902b49288218b6044ba0433eea13812 Mon Sep 17 00:00:00 2001 From: hailin Date: Sun, 21 Dec 2025 00:32:58 -0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=90=88=E5=B9=B6=20identity-servi?= =?UTF-8?q?ce=20migrations=20=E4=B8=BA=E5=8D=95=E4=B8=80=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 7 个碎片化的 migration 文件合并为一个完整的 init migration: - 删除增量 migrations (add_user_totp, add_outbox_events, add_password_hash 等) - 创建统一的 20241204000000_init migration 包含所有表结构 - 包含所有索引、外键约束、序列设置和系统种子用户 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .../20241204000000_init/migration.sql | 402 ++++++++++-------- .../migration.sql | 21 - .../migration.sql | 31 -- .../migration.sql | 2 - .../migration.sql | 26 -- .../migration.sql | 21 - .../migration.sql | 35 -- 7 files changed, 234 insertions(+), 304 deletions(-) delete mode 100644 backend/services/identity-service/prisma/migrations/20251215000000_add_user_totp/migration.sql delete mode 100644 backend/services/identity-service/prisma/migrations/20251217000000_add_outbox_events/migration.sql delete mode 100644 backend/services/identity-service/prisma/migrations/20251218000000_add_password_hash/migration.sql delete mode 100644 backend/services/identity-service/prisma/migrations/20251219130000_add_admin_accounts/migration.sql delete mode 100644 backend/services/identity-service/prisma/migrations/20251220000000_set_user_id_sequence_start/migration.sql delete mode 100644 backend/services/identity-service/prisma/migrations/20251220070000_add_system_seed_user/migration.sql diff --git a/backend/services/identity-service/prisma/migrations/20241204000000_init/migration.sql b/backend/services/identity-service/prisma/migrations/20241204000000_init/migration.sql index d456bde8..ec933df3 100644 --- a/backend/services/identity-service/prisma/migrations/20241204000000_init/migration.sql +++ b/backend/services/identity-service/prisma/migrations/20241204000000_init/migration.sql @@ -1,8 +1,9 @@ --- CreateTable +-- CreateTable: user_accounts - 用户账户主表 CREATE TABLE "user_accounts" ( "user_id" BIGSERIAL NOT NULL, "account_sequence" VARCHAR(12) NOT NULL, "phone_number" VARCHAR(20), + "password_hash" VARCHAR(100), "nickname" VARCHAR(100) NOT NULL, "avatar_url" TEXT, "inviter_sequence" VARCHAR(12), @@ -21,7 +22,7 @@ CREATE TABLE "user_accounts" ( CONSTRAINT "user_accounts_pkey" PRIMARY KEY ("user_id") ); --- CreateTable +-- CreateTable: user_devices - 用户设备信息 CREATE TABLE "user_devices" ( "id" BIGSERIAL NOT NULL, "user_id" BIGINT NOT NULL, @@ -42,7 +43,7 @@ CREATE TABLE "user_devices" ( CONSTRAINT "user_devices_pkey" PRIMARY KEY ("id") ); --- CreateTable +-- CreateTable: wallet_addresses - 钱包地址绑定 CREATE TABLE "wallet_addresses" ( "address_id" BIGSERIAL NOT NULL, "user_id" BIGINT NOT NULL, @@ -59,7 +60,7 @@ CREATE TABLE "wallet_addresses" ( CONSTRAINT "wallet_addresses_pkey" PRIMARY KEY ("address_id") ); --- CreateTable +-- CreateTable: account_sequence_generator - 账户序列号生成器 CREATE TABLE "account_sequence_generator" ( "id" SERIAL NOT NULL, "date_key" VARCHAR(6) NOT NULL, @@ -69,10 +70,7 @@ CREATE TABLE "account_sequence_generator" ( CONSTRAINT "account_sequence_generator_pkey" PRIMARY KEY ("id") ); --- CreateIndex: account_sequence_generator unique constraint -CREATE UNIQUE INDEX "account_sequence_generator_date_key_key" ON "account_sequence_generator"("date_key"); - --- CreateTable +-- CreateTable: user_events - 用户事件日志 CREATE TABLE "user_events" ( "event_id" BIGSERIAL NOT NULL, "event_type" VARCHAR(50) NOT NULL, @@ -86,7 +84,7 @@ CREATE TABLE "user_events" ( CONSTRAINT "user_events_pkey" PRIMARY KEY ("event_id") ); --- CreateTable +-- CreateTable: device_tokens - 设备 Refresh Token CREATE TABLE "device_tokens" ( "id" BIGSERIAL NOT NULL, "user_id" BIGINT NOT NULL, @@ -99,7 +97,7 @@ CREATE TABLE "device_tokens" ( CONSTRAINT "device_tokens_pkey" PRIMARY KEY ("id") ); --- CreateTable +-- CreateTable: dead_letter_events - 死信队列 CREATE TABLE "dead_letter_events" ( "id" BIGSERIAL NOT NULL, "topic" VARCHAR(100) NOT NULL, @@ -117,7 +115,7 @@ CREATE TABLE "dead_letter_events" ( CONSTRAINT "dead_letter_events_pkey" PRIMARY KEY ("id") ); --- CreateTable +-- CreateTable: sms_codes - 短信验证码 CREATE TABLE "sms_codes" ( "id" BIGSERIAL NOT NULL, "phone_number" VARCHAR(20) NOT NULL, @@ -130,7 +128,7 @@ CREATE TABLE "sms_codes" ( CONSTRAINT "sms_codes_pkey" PRIMARY KEY ("id") ); --- CreateTable +-- CreateTable: mpc_key_shares - MPC 密钥分片 CREATE TABLE "mpc_key_shares" ( "share_id" BIGSERIAL NOT NULL, "user_id" BIGINT NOT NULL, @@ -146,7 +144,7 @@ CREATE TABLE "mpc_key_shares" ( CONSTRAINT "mpc_key_shares_pkey" PRIMARY KEY ("share_id") ); --- CreateTable +-- CreateTable: mpc_sessions - MPC 会话记录 CREATE TABLE "mpc_sessions" ( "session_id" VARCHAR(50) NOT NULL, "session_type" VARCHAR(20) NOT NULL, @@ -164,143 +162,7 @@ CREATE TABLE "mpc_sessions" ( CONSTRAINT "mpc_sessions_pkey" PRIMARY KEY ("session_id") ); --- CreateTable -CREATE TABLE "referral_links" ( - "link_id" BIGSERIAL NOT NULL, - "user_id" BIGINT NOT NULL, - "referral_code" VARCHAR(10) NOT NULL, - "short_code" VARCHAR(10) NOT NULL, - "channel" VARCHAR(50), - "campaign_id" VARCHAR(50), - "click_count" INTEGER NOT NULL DEFAULT 0, - "register_count" INTEGER NOT NULL DEFAULT 0, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "expires_at" TIMESTAMP(3), - - CONSTRAINT "referral_links_pkey" PRIMARY KEY ("link_id") -); - --- CreateIndex -CREATE UNIQUE INDEX "user_accounts_account_sequence_key" ON "user_accounts"("account_sequence"); - --- CreateIndex -CREATE UNIQUE INDEX "user_accounts_phone_number_key" ON "user_accounts"("phone_number"); - --- CreateIndex -CREATE UNIQUE INDEX "user_accounts_referral_code_key" ON "user_accounts"("referral_code"); - --- CreateIndex -CREATE INDEX "idx_phone" ON "user_accounts"("phone_number"); - --- CreateIndex -CREATE INDEX "idx_sequence" ON "user_accounts"("account_sequence"); - --- CreateIndex -CREATE INDEX "idx_referral_code" ON "user_accounts"("referral_code"); - --- CreateIndex -CREATE INDEX "idx_inviter" ON "user_accounts"("inviter_sequence"); - --- CreateIndex -CREATE INDEX "idx_kyc_status" ON "user_accounts"("kyc_status"); - --- CreateIndex -CREATE INDEX "idx_status" ON "user_accounts"("status"); - --- CreateIndex -CREATE INDEX "idx_device" ON "user_devices"("device_id"); - --- CreateIndex -CREATE INDEX "idx_user" ON "user_devices"("user_id"); - --- CreateIndex -CREATE INDEX "idx_last_active" ON "user_devices"("last_active_at"); - --- CreateIndex -CREATE INDEX "idx_platform" ON "user_devices"("platform"); - --- CreateIndex -CREATE UNIQUE INDEX "uk_user_device" ON "user_devices"("user_id", "device_id"); - --- CreateIndex -CREATE INDEX "idx_wallet_user" ON "wallet_addresses"("user_id"); - --- CreateIndex -CREATE INDEX "idx_address" ON "wallet_addresses"("address"); - --- CreateIndex -CREATE INDEX "idx_public_key" ON "wallet_addresses"("public_key"); - --- CreateIndex -CREATE UNIQUE INDEX "uk_user_chain" ON "wallet_addresses"("user_id", "chain_type"); - --- CreateIndex -CREATE UNIQUE INDEX "uk_chain_address" ON "wallet_addresses"("chain_type", "address"); - --- CreateIndex -CREATE INDEX "idx_aggregate" ON "user_events"("aggregate_type", "aggregate_id"); - --- CreateIndex -CREATE INDEX "idx_event_type" ON "user_events"("event_type"); - --- CreateIndex -CREATE INDEX "idx_event_user" ON "user_events"("user_id"); - --- CreateIndex -CREATE INDEX "idx_occurred" ON "user_events"("occurred_at"); - --- CreateIndex -CREATE UNIQUE INDEX "device_tokens_refresh_token_hash_key" ON "device_tokens"("refresh_token_hash"); - --- CreateIndex -CREATE INDEX "idx_user_device_token" ON "device_tokens"("user_id", "device_id"); - --- CreateIndex -CREATE INDEX "idx_expires" ON "device_tokens"("expires_at"); - --- CreateIndex -CREATE INDEX "idx_topic" ON "dead_letter_events"("topic"); - --- CreateIndex -CREATE INDEX "idx_dead_letter_event_type" ON "dead_letter_events"("event_type"); - --- CreateIndex -CREATE INDEX "idx_dead_letter_created" ON "dead_letter_events"("created_at"); - --- CreateIndex -CREATE INDEX "idx_processed" ON "dead_letter_events"("processed_at"); - --- CreateIndex -CREATE INDEX "idx_phone_purpose" ON "sms_codes"("phone_number", "purpose"); - --- CreateIndex -CREATE INDEX "idx_sms_expires" ON "sms_codes"("expires_at"); - --- CreateIndex -CREATE UNIQUE INDEX "mpc_key_shares_user_id_key" ON "mpc_key_shares"("user_id"); - --- CreateIndex -CREATE UNIQUE INDEX "mpc_key_shares_public_key_key" ON "mpc_key_shares"("public_key"); - --- CreateIndex -CREATE INDEX "idx_mpc_public_key" ON "mpc_key_shares"("public_key"); - --- CreateIndex -CREATE INDEX "idx_mpc_status" ON "mpc_key_shares"("status"); - --- CreateIndex -CREATE INDEX "idx_session_type" ON "mpc_sessions"("session_type"); - --- CreateIndex -CREATE INDEX "idx_session_user" ON "mpc_sessions"("user_id"); - --- CreateIndex -CREATE INDEX "idx_session_status" ON "mpc_sessions"("status"); - --- CreateIndex -CREATE INDEX "idx_session_created" ON "mpc_sessions"("created_at"); - --- CreateTable +-- CreateTable: recovery_mnemonics - 助记词恢复 CREATE TABLE "recovery_mnemonics" ( "id" BIGSERIAL NOT NULL, "user_id" BIGINT NOT NULL, @@ -317,36 +179,240 @@ CREATE TABLE "recovery_mnemonics" ( CONSTRAINT "recovery_mnemonics_pkey" PRIMARY KEY ("id") ); --- CreateIndex +-- CreateTable: user_totp - TOTP 二次验证 +CREATE TABLE "user_totp" ( + "id" BIGSERIAL NOT NULL, + "user_id" BIGINT NOT NULL, + "encrypted_secret" VARCHAR(100) NOT NULL, + "is_enabled" BOOLEAN NOT NULL DEFAULT false, + "is_verified" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "enabled_at" TIMESTAMP(3), + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "user_totp_pkey" PRIMARY KEY ("id") +); + +-- CreateTable: referral_links - 推荐链接追踪 +CREATE TABLE "referral_links" ( + "link_id" BIGSERIAL NOT NULL, + "user_id" BIGINT NOT NULL, + "referral_code" VARCHAR(10) NOT NULL, + "short_code" VARCHAR(10) NOT NULL, + "channel" VARCHAR(50), + "campaign_id" VARCHAR(50), + "click_count" INTEGER NOT NULL DEFAULT 0, + "register_count" INTEGER NOT NULL DEFAULT 0, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "expires_at" TIMESTAMP(3), + + CONSTRAINT "referral_links_pkey" PRIMARY KEY ("link_id") +); + +-- CreateTable: admin_accounts - 管理员账户 +CREATE TABLE "admin_accounts" ( + "id" BIGSERIAL NOT NULL, + "email" VARCHAR(100) NOT NULL, + "password_hash" VARCHAR(100) NOT NULL, + "nickname" VARCHAR(100) NOT NULL, + "role" VARCHAR(20) NOT NULL DEFAULT 'admin', + "status" VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "last_login_at" TIMESTAMP(3), + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "admin_accounts_pkey" PRIMARY KEY ("id") +); + +-- CreateTable: outbox_events - Outbox Pattern 事件表 +CREATE TABLE "outbox_events" ( + "outbox_id" BIGSERIAL NOT NULL, + "event_type" VARCHAR(100) NOT NULL, + "topic" VARCHAR(100) NOT NULL, + "key" VARCHAR(200) NOT NULL, + "payload" JSONB NOT NULL, + "aggregate_id" VARCHAR(100) NOT NULL, + "aggregate_type" VARCHAR(50) NOT NULL, + "status" VARCHAR(20) NOT NULL DEFAULT 'PENDING', + "retry_count" INTEGER NOT NULL DEFAULT 0, + "max_retries" INTEGER NOT NULL DEFAULT 5, + "last_error" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "published_at" TIMESTAMP(3), + "next_retry_at" TIMESTAMP(3), + + CONSTRAINT "outbox_events_pkey" PRIMARY KEY ("outbox_id") +); + +-- ============================================ +-- CreateIndex: user_accounts +-- ============================================ +CREATE UNIQUE INDEX "user_accounts_account_sequence_key" ON "user_accounts"("account_sequence"); +CREATE UNIQUE INDEX "user_accounts_phone_number_key" ON "user_accounts"("phone_number"); +CREATE UNIQUE INDEX "user_accounts_referral_code_key" ON "user_accounts"("referral_code"); +CREATE INDEX "idx_phone" ON "user_accounts"("phone_number"); +CREATE INDEX "idx_sequence" ON "user_accounts"("account_sequence"); +CREATE INDEX "idx_referral_code" ON "user_accounts"("referral_code"); +CREATE INDEX "idx_inviter" ON "user_accounts"("inviter_sequence"); +CREATE INDEX "idx_kyc_status" ON "user_accounts"("kyc_status"); +CREATE INDEX "idx_status" ON "user_accounts"("status"); + +-- ============================================ +-- CreateIndex: user_devices +-- ============================================ +CREATE UNIQUE INDEX "uk_user_device" ON "user_devices"("user_id", "device_id"); +CREATE INDEX "idx_device" ON "user_devices"("device_id"); +CREATE INDEX "idx_user" ON "user_devices"("user_id"); +CREATE INDEX "idx_last_active" ON "user_devices"("last_active_at"); +CREATE INDEX "idx_platform" ON "user_devices"("platform"); + +-- ============================================ +-- CreateIndex: wallet_addresses +-- ============================================ +CREATE UNIQUE INDEX "uk_user_chain" ON "wallet_addresses"("user_id", "chain_type"); +CREATE UNIQUE INDEX "uk_chain_address" ON "wallet_addresses"("chain_type", "address"); +CREATE INDEX "idx_wallet_user" ON "wallet_addresses"("user_id"); +CREATE INDEX "idx_address" ON "wallet_addresses"("address"); +CREATE INDEX "idx_public_key" ON "wallet_addresses"("public_key"); + +-- ============================================ +-- CreateIndex: account_sequence_generator +-- ============================================ +CREATE UNIQUE INDEX "account_sequence_generator_date_key_key" ON "account_sequence_generator"("date_key"); + +-- ============================================ +-- CreateIndex: user_events +-- ============================================ +CREATE INDEX "idx_aggregate" ON "user_events"("aggregate_type", "aggregate_id"); +CREATE INDEX "idx_event_type" ON "user_events"("event_type"); +CREATE INDEX "idx_event_user" ON "user_events"("user_id"); +CREATE INDEX "idx_occurred" ON "user_events"("occurred_at"); + +-- ============================================ +-- CreateIndex: device_tokens +-- ============================================ +CREATE UNIQUE INDEX "device_tokens_refresh_token_hash_key" ON "device_tokens"("refresh_token_hash"); +CREATE INDEX "idx_user_device_token" ON "device_tokens"("user_id", "device_id"); +CREATE INDEX "idx_expires" ON "device_tokens"("expires_at"); + +-- ============================================ +-- CreateIndex: dead_letter_events +-- ============================================ +CREATE INDEX "idx_topic" ON "dead_letter_events"("topic"); +CREATE INDEX "idx_dead_letter_event_type" ON "dead_letter_events"("event_type"); +CREATE INDEX "idx_dead_letter_created" ON "dead_letter_events"("created_at"); +CREATE INDEX "idx_processed" ON "dead_letter_events"("processed_at"); + +-- ============================================ +-- CreateIndex: sms_codes +-- ============================================ +CREATE INDEX "idx_phone_purpose" ON "sms_codes"("phone_number", "purpose"); +CREATE INDEX "idx_sms_expires" ON "sms_codes"("expires_at"); + +-- ============================================ +-- CreateIndex: mpc_key_shares +-- ============================================ +CREATE UNIQUE INDEX "mpc_key_shares_user_id_key" ON "mpc_key_shares"("user_id"); +CREATE UNIQUE INDEX "mpc_key_shares_public_key_key" ON "mpc_key_shares"("public_key"); +CREATE INDEX "idx_mpc_public_key" ON "mpc_key_shares"("public_key"); +CREATE INDEX "idx_mpc_status" ON "mpc_key_shares"("status"); + +-- ============================================ +-- CreateIndex: mpc_sessions +-- ============================================ +CREATE INDEX "idx_session_type" ON "mpc_sessions"("session_type"); +CREATE INDEX "idx_session_user" ON "mpc_sessions"("user_id"); +CREATE INDEX "idx_session_status" ON "mpc_sessions"("status"); +CREATE INDEX "idx_session_created" ON "mpc_sessions"("created_at"); + +-- ============================================ +-- CreateIndex: recovery_mnemonics +-- ============================================ CREATE UNIQUE INDEX "uk_user_active_mnemonic" ON "recovery_mnemonics"("user_id", "status"); - --- CreateIndex CREATE INDEX "idx_recovery_user" ON "recovery_mnemonics"("user_id"); - --- CreateIndex CREATE INDEX "idx_recovery_public_key" ON "recovery_mnemonics"("public_key"); - --- CreateIndex CREATE INDEX "idx_recovery_status" ON "recovery_mnemonics"("status"); --- CreateIndex +-- ============================================ +-- CreateIndex: user_totp +-- ============================================ +CREATE UNIQUE INDEX "user_totp_user_id_key" ON "user_totp"("user_id"); +CREATE INDEX "idx_totp_user" ON "user_totp"("user_id"); + +-- ============================================ +-- CreateIndex: referral_links +-- ============================================ CREATE UNIQUE INDEX "referral_links_short_code_key" ON "referral_links"("short_code"); - --- CreateIndex CREATE INDEX "idx_referral_link_user" ON "referral_links"("user_id"); - --- CreateIndex CREATE INDEX "idx_referral_link_code" ON "referral_links"("referral_code"); - --- CreateIndex CREATE INDEX "idx_referral_link_channel" ON "referral_links"("channel"); - --- CreateIndex CREATE INDEX "idx_referral_link_created" ON "referral_links"("created_at"); --- AddForeignKey +-- ============================================ +-- CreateIndex: admin_accounts +-- ============================================ +CREATE UNIQUE INDEX "admin_accounts_email_key" ON "admin_accounts"("email"); +CREATE INDEX "idx_admin_email" ON "admin_accounts"("email"); +CREATE INDEX "idx_admin_role" ON "admin_accounts"("role"); +CREATE INDEX "idx_admin_status" ON "admin_accounts"("status"); + +-- ============================================ +-- CreateIndex: outbox_events +-- ============================================ +CREATE INDEX "outbox_events_status_created_at_idx" ON "outbox_events"("status", "created_at"); +CREATE INDEX "outbox_events_status_next_retry_at_idx" ON "outbox_events"("status", "next_retry_at"); +CREATE INDEX "outbox_events_aggregate_type_aggregate_id_idx" ON "outbox_events"("aggregate_type", "aggregate_id"); +CREATE INDEX "outbox_events_topic_idx" ON "outbox_events"("topic"); + +-- ============================================ +-- AddForeignKey: user_devices -> user_accounts +-- ============================================ ALTER TABLE "user_devices" ADD CONSTRAINT "user_devices_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "user_accounts"("user_id") ON DELETE CASCADE ON UPDATE CASCADE; --- AddForeignKey +-- ============================================ +-- AddForeignKey: wallet_addresses -> user_accounts +-- ============================================ ALTER TABLE "wallet_addresses" ADD CONSTRAINT "wallet_addresses_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "user_accounts"("user_id") ON DELETE CASCADE ON UPDATE CASCADE; +-- ============================================ +-- Set user_id sequence to start from 10 +-- This reserves user IDs 1-9 for system accounts +-- ============================================ +DO $$ +DECLARE + current_val BIGINT; +BEGIN + SELECT last_value INTO current_val FROM user_accounts_user_id_seq; + IF current_val < 10 THEN + PERFORM setval('user_accounts_user_id_seq', 10, false); + RAISE NOTICE 'Sequence reset to start from 10'; + ELSE + RAISE NOTICE 'Sequence already at % (>= 10), no reset needed', current_val; + END IF; +END $$; + +-- ============================================ +-- Insert System Seed User (GENESIS) +-- userId: 1, accountSequence: SYSTEM00001, referralCode: GENESIS +-- ============================================ +INSERT INTO "user_accounts" ( + "user_id", + "account_sequence", + "referral_code", + "nickname", + "phone_number", + "kyc_status", + "status", + "registered_at", + "updated_at" +) VALUES ( + 1, + 'SYSTEM00001', + 'GENESIS', + '系统', + NULL, + 'NOT_VERIFIED', + 'ACTIVE', + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP +) ON CONFLICT ("user_id") DO NOTHING; diff --git a/backend/services/identity-service/prisma/migrations/20251215000000_add_user_totp/migration.sql b/backend/services/identity-service/prisma/migrations/20251215000000_add_user_totp/migration.sql deleted file mode 100644 index 21f064b4..00000000 --- a/backend/services/identity-service/prisma/migrations/20251215000000_add_user_totp/migration.sql +++ /dev/null @@ -1,21 +0,0 @@ --- CreateTable: user_totp --- TOTP 二次验证表,用于提现、转账等敏感操作 - -CREATE TABLE "user_totp" ( - "id" BIGSERIAL NOT NULL, - "user_id" BIGINT NOT NULL, - "encrypted_secret" VARCHAR(100) NOT NULL, - "is_enabled" BOOLEAN NOT NULL DEFAULT false, - "is_verified" BOOLEAN NOT NULL DEFAULT false, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "enabled_at" TIMESTAMP(3), - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "user_totp_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "user_totp_user_id_key" ON "user_totp"("user_id"); - --- CreateIndex -CREATE INDEX "idx_totp_user" ON "user_totp"("user_id"); diff --git a/backend/services/identity-service/prisma/migrations/20251217000000_add_outbox_events/migration.sql b/backend/services/identity-service/prisma/migrations/20251217000000_add_outbox_events/migration.sql deleted file mode 100644 index 80955d78..00000000 --- a/backend/services/identity-service/prisma/migrations/20251217000000_add_outbox_events/migration.sql +++ /dev/null @@ -1,31 +0,0 @@ --- CreateTable -CREATE TABLE "outbox_events" ( - "outbox_id" BIGSERIAL NOT NULL, - "event_type" VARCHAR(100) NOT NULL, - "topic" VARCHAR(100) NOT NULL, - "key" VARCHAR(200) NOT NULL, - "payload" JSONB NOT NULL, - "aggregate_id" VARCHAR(100) NOT NULL, - "aggregate_type" VARCHAR(50) NOT NULL, - "status" VARCHAR(20) NOT NULL DEFAULT 'PENDING', - "retry_count" INTEGER NOT NULL DEFAULT 0, - "max_retries" INTEGER NOT NULL DEFAULT 5, - "last_error" TEXT, - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "published_at" TIMESTAMP(3), - "next_retry_at" TIMESTAMP(3), - - CONSTRAINT "outbox_events_pkey" PRIMARY KEY ("outbox_id") -); - --- CreateIndex -CREATE INDEX "outbox_events_status_created_at_idx" ON "outbox_events"("status", "created_at"); - --- CreateIndex -CREATE INDEX "outbox_events_status_next_retry_at_idx" ON "outbox_events"("status", "next_retry_at"); - --- CreateIndex -CREATE INDEX "outbox_events_aggregate_type_aggregate_id_idx" ON "outbox_events"("aggregate_type", "aggregate_id"); - --- CreateIndex -CREATE INDEX "outbox_events_topic_idx" ON "outbox_events"("topic"); diff --git a/backend/services/identity-service/prisma/migrations/20251218000000_add_password_hash/migration.sql b/backend/services/identity-service/prisma/migrations/20251218000000_add_password_hash/migration.sql deleted file mode 100644 index b26e204a..00000000 --- a/backend/services/identity-service/prisma/migrations/20251218000000_add_password_hash/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable: Add password_hash column to user_accounts -ALTER TABLE "user_accounts" ADD COLUMN "password_hash" VARCHAR(100); diff --git a/backend/services/identity-service/prisma/migrations/20251219130000_add_admin_accounts/migration.sql b/backend/services/identity-service/prisma/migrations/20251219130000_add_admin_accounts/migration.sql deleted file mode 100644 index dab0de55..00000000 --- a/backend/services/identity-service/prisma/migrations/20251219130000_add_admin_accounts/migration.sql +++ /dev/null @@ -1,26 +0,0 @@ --- CreateTable -CREATE TABLE "admin_accounts" ( - "id" BIGSERIAL NOT NULL, - "email" VARCHAR(100) NOT NULL, - "password_hash" VARCHAR(100) NOT NULL, - "nickname" VARCHAR(100) NOT NULL, - "role" VARCHAR(20) NOT NULL DEFAULT 'admin', - "status" VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', - "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "last_login_at" TIMESTAMP(3), - "updated_at" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "admin_accounts_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "admin_accounts_email_key" ON "admin_accounts"("email"); - --- CreateIndex -CREATE INDEX "idx_admin_email" ON "admin_accounts"("email"); - --- CreateIndex -CREATE INDEX "idx_admin_role" ON "admin_accounts"("role"); - --- CreateIndex -CREATE INDEX "idx_admin_status" ON "admin_accounts"("status"); diff --git a/backend/services/identity-service/prisma/migrations/20251220000000_set_user_id_sequence_start/migration.sql b/backend/services/identity-service/prisma/migrations/20251220000000_set_user_id_sequence_start/migration.sql deleted file mode 100644 index 79361a12..00000000 --- a/backend/services/identity-service/prisma/migrations/20251220000000_set_user_id_sequence_start/migration.sql +++ /dev/null @@ -1,21 +0,0 @@ --- Set user_id sequence to start from 10 --- This reserves user IDs 1-9 for system accounts - --- Check current sequence value -DO $$ -DECLARE - current_val BIGINT; -BEGIN - -- Get current sequence value - SELECT last_value INTO current_val FROM user_accounts_user_id_seq; - - -- Only reset if current value is less than 10 - IF current_val < 10 THEN - -- Set sequence to start from 10 - -- Using setval with false means next nextval() will return 10 - PERFORM setval('user_accounts_user_id_seq', 10, false); - RAISE NOTICE 'Sequence reset to start from 10'; - ELSE - RAISE NOTICE 'Sequence already at % (>= 10), no reset needed', current_val; - END IF; -END $$; diff --git a/backend/services/identity-service/prisma/migrations/20251220070000_add_system_seed_user/migration.sql b/backend/services/identity-service/prisma/migrations/20251220070000_add_system_seed_user/migration.sql deleted file mode 100644 index 26b68714..00000000 --- a/backend/services/identity-service/prisma/migrations/20251220070000_add_system_seed_user/migration.sql +++ /dev/null @@ -1,35 +0,0 @@ --- CreateSystemSeedUser: 创建系统种子用户作为根推荐人 --- 这个用户只用于提供推荐码,不具备登录和其他功能 --- --- 注意:之前的 migration (20251220000000_set_user_id_sequence_start) --- 已经预留了 user_id 1-9 给系统账号,所以这里使用 ID 1 是安全的 - --- 插入系统种子用户 --- userId: 1 (在预留范围 1-9 内) --- accountSequence: SYSTEM00001 (系统账号标识) --- referralCode: GENESIS (创世推荐码) --- nickname: 系统 (必填字段) -INSERT INTO "user_accounts" ( - "user_id", - "account_sequence", - "referral_code", - "nickname", - "phone_number", - "kyc_status", - "status", - "registered_at", - "updated_at" -) VALUES ( - 1, -- 使用预留的系统账号 ID - 'SYSTEM00001', - 'GENESIS', - '系统', -- 必填字段 - NULL, -- 系统用户不需要手机号 - 'NOT_VERIFIED', - 'ACTIVE', - NOW(), - NOW() -) ON CONFLICT (user_id) DO NOTHING; -- 如果已存在则跳过 - --- 注意:不需要重置序列,因为之前的 migration 已经设置序列从 10 开始 --- 这样确保普通用户的 ID 从 10 开始,不会与系统账号(1-9)冲突