fix(infra): reconcile shared Prisma migration history

This commit is contained in:
2026-07-30 17:20:52 +00:00
parent 5fa812b551
commit d6904f2c9d
4 changed files with 104 additions and 0 deletions
+4
View File
@@ -149,6 +149,10 @@ pnpm --filter @sammo-ts/infra prisma:migrate:deploy:gateway
pnpm migrate:legacy -- --help
```
Game과 gateway가 같은 database/schema를 쓰므로 deploy 순서는
`game → gateway`입니다. 양쪽 migration directory 이름은 공유
`_prisma_migrations`에서 충돌하지 않도록 전역적으로 고유해야 합니다.
활성 외부 prefix는 `/gateway/`, `/che/`, `/hwe/`입니다. 앱은 필요한
listener를 `0.0.0.0`에 bind하고 prefix를 보존한 frontend, tRPC, SSE,
direct-navigation URL을 사용합니다. `/image/*`는 외부 Caddy가 소유합니다.
+6
View File
@@ -29,12 +29,16 @@ enum AuctionStatus {
FINALIZING
FINISHED
CANCELED
@@map("auction_status")
}
enum AuctionType {
BUY_RICE
SELL_RICE
UNIQUE_ITEM
@@map("auction_type")
}
enum DiplomacyLetterState {
@@ -42,6 +46,8 @@ enum DiplomacyLetterState {
ACTIVATED
CANCELLED
REPLACED
@@map("diplomacy_letter_state")
}
enum InputEventStatus {
@@ -0,0 +1,43 @@
-- The game and gateway histories once used the same 20260727000000 migration
-- name. Prisma records names in one shared table, so whichever history ran
-- second skipped its different archive SQL. Reapply the gateway side
-- idempotently under a globally unique migration name.
ALTER TABLE "app_user"
ADD COLUMN IF NOT EXISTS "legacy_data" JSONB NOT NULL DEFAULT '{}'::jsonb;
ALTER TABLE "system"
ADD COLUMN IF NOT EXISTS "registration_enabled" BOOLEAN NOT NULL DEFAULT FALSE,
ADD COLUMN IF NOT EXISTS "login_enabled" BOOLEAN NOT NULL DEFAULT FALSE,
ADD COLUMN IF NOT EXISTS "created_at" TIMESTAMP(3),
ADD COLUMN IF NOT EXISTS "updated_at" TIMESTAMP(3);
CREATE TABLE IF NOT EXISTS "legacy_member_log" (
"id" BIGINT PRIMARY KEY,
"member_no" INTEGER NOT NULL,
"user_id" TEXT NOT NULL,
"date" TIMESTAMP(3) NOT NULL,
"action_type" TEXT NOT NULL,
"action" JSONB
);
CREATE INDEX IF NOT EXISTS "legacy_member_log_user_date"
ON "legacy_member_log" ("user_id", "date");
CREATE INDEX IF NOT EXISTS "legacy_member_log_member_date"
ON "legacy_member_log" ("member_no", "date");
CREATE TABLE IF NOT EXISTS "legacy_banned_member" (
"no" INTEGER PRIMARY KEY,
"hashed_email" TEXT NOT NULL UNIQUE,
"info" TEXT
);
CREATE TABLE IF NOT EXISTS "legacy_root_key_value" (
"id" SERIAL PRIMARY KEY,
"source_table" TEXT NOT NULL,
"namespace" TEXT NOT NULL,
"key" TEXT NOT NULL,
"value" JSONB NOT NULL,
"migrated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "legacy_root_key_value_source_namespace_key"
UNIQUE ("source_table", "namespace", "key")
);
@@ -0,0 +1,51 @@
-- The game and gateway histories once used the same 20260727000000 migration
-- name. Prisma records names in one shared table, so whichever history ran
-- second skipped its different archive SQL. Reapply the game side idempotently.
ALTER TABLE "ng_old_nations"
ADD COLUMN IF NOT EXISTS "source_id" INTEGER NOT NULL DEFAULT 0;
DROP INDEX IF EXISTS "ng_old_nations_server_id_nation";
CREATE UNIQUE INDEX IF NOT EXISTS "ng_old_nations_server_nation_source"
ON "ng_old_nations" ("server_id", "nation", "source_id");
ALTER TABLE "yearbook_history"
ADD COLUMN IF NOT EXISTS "source_id" INTEGER NOT NULL DEFAULT 0,
ADD COLUMN IF NOT EXISTS "global_history" JSONB NOT NULL DEFAULT '[]'::jsonb,
ADD COLUMN IF NOT EXISTS "global_action" JSONB NOT NULL DEFAULT '[]'::jsonb;
DROP INDEX IF EXISTS "yearbook_history_profile_year_month_key";
CREATE UNIQUE INDEX IF NOT EXISTS "yearbook_history_profile_year_month_source"
ON "yearbook_history" ("profile_name", "year", "month", "source_id");
ALTER TABLE "inheritance_log"
ADD COLUMN IF NOT EXISTS "legacy_id" INTEGER,
ADD COLUMN IF NOT EXISTS "server_id" TEXT,
ADD COLUMN IF NOT EXISTS "log_type" TEXT NOT NULL DEFAULT 'inheritPoint';
CREATE UNIQUE INDEX IF NOT EXISTS "inheritance_log_legacy_id_key"
ON "inheritance_log" ("legacy_id");
ALTER TABLE "emperior"
ADD COLUMN IF NOT EXISTS "legacy_id" INTEGER;
CREATE UNIQUE INDEX IF NOT EXISTS "emperior_legacy_id_key"
ON "emperior" ("legacy_id");
ALTER TABLE "inheritance_result"
ADD COLUMN IF NOT EXISTS "legacy_id" INTEGER;
CREATE UNIQUE INDEX IF NOT EXISTS "inheritance_result_legacy_id_key"
ON "inheritance_result" ("legacy_id");
CREATE TABLE IF NOT EXISTS "legacy_game_storage" (
"id" SERIAL PRIMARY KEY,
"source_id" INTEGER NOT NULL,
"namespace" TEXT NOT NULL,
"key" TEXT NOT NULL,
"value" JSONB NOT NULL,
"scope" TEXT NOT NULL,
"migrated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "legacy_game_storage_source_id_key" UNIQUE ("source_id"),
CONSTRAINT "legacy_game_storage_namespace_key" UNIQUE ("namespace", "key")
);
CREATE INDEX IF NOT EXISTS "legacy_game_storage_scope_namespace"
ON "legacy_game_storage" ("scope", "namespace");