1
0
Fork 0

refactor(migrations): split tickets DDL out of migration 7 into migration 8

Migration 7 originally bundled tickets DDL with pending schema drift, which made it fail against prod (no tickets objects existed there). Split into a stripped migration 7 (no tickets statements) and a new tickets-only migration 8 that creates enum_tickets_* types, ALTER TYPE ADD VALUE for 'tickets' + 'ticket:*' muted-type values, tickets and tickets_activity tables, and the payload_locked_documents_rels.tickets_id column + FK + index. Migration 8's .json snapshot is the new forward baseline for migrate:create (verified via zero-diff probe). Applied to prod: m1-7 baselined as batch 1, m8 applied as batch 2.
This commit is contained in:
Jason Fraley 2026-08-16 19:38:56 -04:00
parent 10560c1446
commit 0ed8721889
4 changed files with 15677 additions and 108 deletions

View file

@ -3,9 +3,9 @@ import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_game_vehicles_status" AS ENUM('idle', 'assigned', 'in_transit', 'damaged', 'destroyed');
CREATE TYPE "public"."enum_game_event_logs_target_collection" AS ENUM('game-structures', 'game-vehicles', 'game-npcs', 'structures', 'resources', 'assets', 'vehicles', 'factions', 'missions', 'campaigns', 'users', 'technologies', 'maps', 'shipments', 'bank-accounts', 'bank-transactions', 'ledger-entries', 'locker-storages', 'loadouts', 'market-listings', 'market-negotiations', 'tickets');
CREATE TYPE "public"."enum_users_preferences_notifications_muted_types" AS ENUM('market:offer', 'market:counter', 'market:accept', 'market:reject', 'market:withdrawn', 'market:closed', 'market:sold', 'market:expired', 'account:discord-request', 'finance:deposit', 'finance:withdraw', 'finance:transfer', 'shipment:completed', 'ticket:created', 'ticket:assigned', 'ticket:reply', 'ticket:status');
CREATE TYPE "public"."enum_users_preferences_discord_muted_types" AS ENUM('market:offer', 'market:counter', 'market:accept', 'market:reject', 'market:withdrawn', 'market:closed', 'market:sold', 'market:expired', 'account:discord-request', 'finance:deposit', 'finance:withdraw', 'finance:transfer', 'shipment:completed', 'ticket:created', 'ticket:assigned', 'ticket:reply', 'ticket:status');
CREATE TYPE "public"."enum_game_event_logs_target_collection" AS ENUM('game-structures', 'game-vehicles', 'game-npcs', 'structures', 'resources', 'assets', 'vehicles', 'factions', 'missions', 'campaigns', 'users', 'technologies', 'maps', 'shipments', 'bank-accounts', 'bank-transactions', 'ledger-entries', 'locker-storages', 'loadouts', 'market-listings', 'market-negotiations');
CREATE TYPE "public"."enum_users_preferences_notifications_muted_types" AS ENUM('market:offer', 'market:counter', 'market:accept', 'market:reject', 'market:withdrawn', 'market:closed', 'market:sold', 'market:expired', 'account:discord-request', 'finance:deposit', 'finance:withdraw', 'finance:transfer', 'shipment:completed');
CREATE TYPE "public"."enum_users_preferences_discord_muted_types" AS ENUM('market:offer', 'market:counter', 'market:accept', 'market:reject', 'market:withdrawn', 'market:closed', 'market:sold', 'market:expired', 'account:discord-request', 'finance:deposit', 'finance:withdraw', 'finance:transfer', 'shipment:completed');
CREATE TYPE "public"."enum_mission_attendances_response" AS ENUM('yes', 'no', 'tentative');
CREATE TYPE "public"."enum_technologies_approval_status" AS ENUM('in_progress', 'ready_for_review', 'approved', 'rejected', 'revision_requested');
CREATE TYPE "public"."enum_assets_skin_configuration_applies_to_asset_types" AS ENUM('weapon', 'uniform', 'vest', 'backpack', 'helmet');
@ -23,10 +23,6 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
CREATE TYPE "public"."enum_market_negotiations_history_from" AS ENUM('buyer', 'seller');
CREATE TYPE "public"."enum_market_negotiations_status" AS ENUM('open', 'accepted', 'rejected', 'closed', 'cancelled', 'expired');
CREATE TYPE "public"."enum_market_negotiations_proposed_by" AS ENUM('buyer', 'seller');
CREATE TYPE "public"."enum_tickets_activity_type" AS ENUM('system', 'agent_message', 'client_message');
CREATE TYPE "public"."enum_tickets_category" AS ENUM('bug_report', 'feature_request', 'support_request', 'other');
CREATE TYPE "public"."enum_tickets_priority" AS ENUM('low', 'medium', 'high', 'critical');
CREATE TYPE "public"."enum_tickets_status" AS ENUM('open', 'in_review', 'planning', 'in_progress', 'waiting_on_reporter', 'in_testing', 'resolved', 'canceled', 'closed');
CREATE TYPE "public"."enum_narrative_events_triggers_type" AS ENUM('manual', 'mission_complete', 'timer', 'condition');
ALTER TYPE "public"."enum_users_roles" ADD VALUE 'trusted' BEFORE 'admin';
ALTER TYPE "public"."enum_factions_type" ADD VALUE 'playerFaction' BEFORE 'majorFaction';
@ -41,7 +37,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"grid_y" numeric NOT NULL,
"rotated" boolean DEFAULT false
);
CREATE TABLE "game_vehicles_stored_resources" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
@ -52,7 +48,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"grid_y" numeric NOT NULL,
"rotated" boolean DEFAULT false
);
CREATE TABLE "game_vehicles_void_storage" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
@ -63,7 +59,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"grid_y" numeric NOT NULL,
"rotated" boolean DEFAULT false
);
CREATE TABLE "game_vehicles" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
@ -76,7 +72,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "game_npcs" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
@ -91,7 +87,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "game_npcs_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
@ -99,7 +95,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"path" varchar NOT NULL,
"assets_id" integer
);
CREATE TABLE "game_event_logs" (
"id" serial PRIMARY KEY NOT NULL,
"system" boolean DEFAULT true,
@ -114,21 +110,21 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "users_preferences_notifications_muted_types" (
"order" integer NOT NULL,
"parent_id" integer NOT NULL,
"value" "enum_users_preferences_notifications_muted_types",
"id" serial PRIMARY KEY NOT NULL
);
CREATE TABLE "users_preferences_discord_muted_types" (
"order" integer NOT NULL,
"parent_id" integer NOT NULL,
"value" "enum_users_preferences_discord_muted_types",
"id" serial PRIMARY KEY NOT NULL
);
CREATE TABLE "user_notifications" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
@ -140,7 +136,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "mission_attendances" (
"id" serial PRIMARY KEY NOT NULL,
"mission_id" integer NOT NULL,
@ -149,7 +145,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "factions_relationships" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
@ -158,21 +154,21 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"value" numeric DEFAULT 0 NOT NULL,
"notes" varchar
);
CREATE TABLE "assets_skin_configuration_applies_to_asset_types" (
"order" integer NOT NULL,
"parent_id" integer NOT NULL,
"value" "enum_assets_skin_configuration_applies_to_asset_types",
"id" serial PRIMARY KEY NOT NULL
);
CREATE TABLE "shipments_cargo" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"amount" numeric NOT NULL
);
CREATE TABLE "shipments" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar,
@ -192,7 +188,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "shipments_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
@ -202,7 +198,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"assets_id" integer,
"vehicles_id" integer
);
CREATE TABLE "bank_accounts" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
@ -215,7 +211,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "bank_transactions" (
"id" serial PRIMARY KEY NOT NULL,
"transaction_number" varchar NOT NULL,
@ -232,7 +228,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "ledger_entries" (
"id" serial PRIMARY KEY NOT NULL,
"account_id" integer NOT NULL,
@ -245,14 +241,14 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "locker_storages_items_equipment_attachments" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"asset_id" integer NOT NULL
);
CREATE TABLE "locker_storages_items" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
@ -265,7 +261,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"equipment_skin_id" integer,
"equipment_custom_name" varchar
);
CREATE TABLE "locker_storages" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar DEFAULT 'Personal Locker' NOT NULL,
@ -274,7 +270,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "loadouts" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
@ -297,7 +293,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "market_listings" (
"id" serial PRIMARY KEY NOT NULL,
"asset_id" integer NOT NULL,
@ -317,7 +313,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "market_negotiations_history" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
@ -327,7 +323,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"note" varchar,
"at" timestamp(3) with time zone NOT NULL
);
CREATE TABLE "market_negotiations" (
"id" serial PRIMARY KEY NOT NULL,
"listing_id" integer NOT NULL,
@ -341,31 +337,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "tickets_activity" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"type" "enum_tickets_activity_type" DEFAULT 'system' NOT NULL,
"content" jsonb NOT NULL,
"author_id" integer,
"created_at" timestamp(3) with time zone
);
CREATE TABLE "tickets" (
"id" serial PRIMARY KEY NOT NULL,
"title" varchar NOT NULL,
"description" jsonb NOT NULL,
"category" "enum_tickets_category" DEFAULT 'support_request' NOT NULL,
"priority" "enum_tickets_priority" DEFAULT 'medium' NOT NULL,
"status" "enum_tickets_status" DEFAULT 'open' NOT NULL,
"reporter_id" integer NOT NULL,
"assignee_id" integer,
"closed_at" timestamp(3) with time zone,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "game_rules_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
@ -373,7 +345,7 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
"path" varchar NOT NULL,
"assignments_id" integer
);
ALTER TABLE "missions" ALTER COLUMN "game_details_game_setup_mission_file_id" DROP NOT NULL;
ALTER TABLE "structures_auto_generated_resources" ALTER COLUMN "min_frequency" SET DEFAULT '1';
ALTER TABLE "game_structures_stored_resources" ADD COLUMN "grid_x" numeric DEFAULT 0 NOT NULL;
@ -435,7 +407,6 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "loadouts_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "market_listings_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "market_negotiations_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "tickets_id" integer;
ALTER TABLE "game_rules" ADD COLUMN "proximity_threshold" numeric DEFAULT 10;
ALTER TABLE "game_rules" ADD COLUMN "game_tick_interval_minutes" numeric DEFAULT 10;
ALTER TABLE "game_rules" ADD COLUMN "locker_grid_width" numeric DEFAULT 10;
@ -509,10 +480,6 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
ALTER TABLE "market_negotiations_history" ADD CONSTRAINT "market_negotiations_history_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."market_negotiations"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "market_negotiations" ADD CONSTRAINT "market_negotiations_listing_id_market_listings_id_fk" FOREIGN KEY ("listing_id") REFERENCES "public"."market_listings"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "market_negotiations" ADD CONSTRAINT "market_negotiations_buyer_id_users_id_fk" FOREIGN KEY ("buyer_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "tickets_activity" ADD CONSTRAINT "tickets_activity_author_id_users_id_fk" FOREIGN KEY ("author_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "tickets_activity" ADD CONSTRAINT "tickets_activity_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."tickets"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "tickets" ADD CONSTRAINT "tickets_reporter_id_users_id_fk" FOREIGN KEY ("reporter_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "tickets" ADD CONSTRAINT "tickets_assignee_id_users_id_fk" FOREIGN KEY ("assignee_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "game_rules_rels" ADD CONSTRAINT "game_rules_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."game_rules"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "game_rules_rels" ADD CONSTRAINT "game_rules_rels_assignments_fk" FOREIGN KEY ("assignments_id") REFERENCES "public"."assignments"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "game_structures_void_storage_order_idx" ON "game_structures_void_storage" USING btree ("_order");
@ -629,16 +596,6 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
CREATE INDEX "market_negotiations_status_idx" ON "market_negotiations" USING btree ("status");
CREATE INDEX "market_negotiations_updated_at_idx" ON "market_negotiations" USING btree ("updated_at");
CREATE INDEX "market_negotiations_created_at_idx" ON "market_negotiations" USING btree ("created_at");
CREATE INDEX "tickets_activity_order_idx" ON "tickets_activity" USING btree ("_order");
CREATE INDEX "tickets_activity_parent_id_idx" ON "tickets_activity" USING btree ("_parent_id");
CREATE INDEX "tickets_activity_author_idx" ON "tickets_activity" USING btree ("author_id");
CREATE INDEX "tickets_category_idx" ON "tickets" USING btree ("category");
CREATE INDEX "tickets_priority_idx" ON "tickets" USING btree ("priority");
CREATE INDEX "tickets_status_idx" ON "tickets" USING btree ("status");
CREATE INDEX "tickets_reporter_idx" ON "tickets" USING btree ("reporter_id");
CREATE INDEX "tickets_assignee_idx" ON "tickets" USING btree ("assignee_id");
CREATE INDEX "tickets_updated_at_idx" ON "tickets" USING btree ("updated_at");
CREATE INDEX "tickets_created_at_idx" ON "tickets" USING btree ("created_at");
CREATE INDEX "game_rules_rels_order_idx" ON "game_rules_rels" USING btree ("order");
CREATE INDEX "game_rules_rels_parent_idx" ON "game_rules_rels" USING btree ("parent_id");
CREATE INDEX "game_rules_rels_path_idx" ON "game_rules_rels" USING btree ("path");
@ -663,7 +620,6 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_loadouts_fk" FOREIGN KEY ("loadouts_id") REFERENCES "public"."loadouts"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_market_listings_fk" FOREIGN KEY ("market_listings_id") REFERENCES "public"."market_listings"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_market_negotiations_fk" FOREIGN KEY ("market_negotiations_id") REFERENCES "public"."market_negotiations"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_tickets_fk" FOREIGN KEY ("tickets_id") REFERENCES "public"."tickets"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "game_structures_faction_idx" ON "game_structures" USING btree ("faction_id");
CREATE UNIQUE INDEX "users_discord_id_idx" ON "users" USING btree ("discord_id");
CREATE INDEX "profiles_rels_qualifications_id_idx" ON "profiles_rels" USING btree ("qualifications_id");
@ -685,7 +641,6 @@ export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
CREATE INDEX "payload_locked_documents_rels_loadouts_id_idx" ON "payload_locked_documents_rels" USING btree ("loadouts_id");
CREATE INDEX "payload_locked_documents_rels_market_listings_id_idx" ON "payload_locked_documents_rels" USING btree ("market_listings_id");
CREATE INDEX "payload_locked_documents_rels_market_negotiations_id_idx" ON "payload_locked_documents_rels" USING btree ("market_negotiations_id");
CREATE INDEX "payload_locked_documents_rels_tickets_id_idx" ON "payload_locked_documents_rels" USING btree ("tickets_id");
ALTER TABLE "missions_factions_involved" DROP COLUMN "faction_name";`)
}
@ -717,8 +672,6 @@ export async function down({ db, payload, req }: MigrateDownArgs): Promise<void>
ALTER TABLE "market_listings" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "market_negotiations_history" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "market_negotiations" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "tickets_activity" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "tickets" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "game_rules_rels" DISABLE ROW LEVEL SECURITY;
DROP TABLE "game_structures_void_storage" CASCADE;
DROP TABLE "game_vehicles_stored_resources" CASCADE;
@ -746,51 +699,47 @@ export async function down({ db, payload, req }: MigrateDownArgs): Promise<void>
DROP TABLE "market_listings" CASCADE;
DROP TABLE "market_negotiations_history" CASCADE;
DROP TABLE "market_negotiations" CASCADE;
DROP TABLE "tickets_activity" CASCADE;
DROP TABLE "tickets" CASCADE;
DROP TABLE "game_rules_rels" CASCADE;
ALTER TABLE "game_structures" DROP CONSTRAINT "game_structures_faction_id_factions_id_fk";
ALTER TABLE "profiles_rels" DROP CONSTRAINT "profiles_rels_qualifications_fk";
ALTER TABLE "missions_factions_involved" DROP CONSTRAINT "missions_factions_involved_faction_id_factions_id_fk";
ALTER TABLE "missions" DROP CONSTRAINT "missions_cover_image_id_media_id_fk";
ALTER TABLE "campaigns" DROP CONSTRAINT "campaigns_cover_image_id_media_id_fk";
ALTER TABLE "factions" DROP CONSTRAINT "factions_cover_image_id_media_id_fk";
ALTER TABLE "vehicles" DROP CONSTRAINT "vehicles_fuel_fuel_type_id_resources_id_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_game_vehicles_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_game_npcs_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_game_event_logs_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_user_notifications_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_mission_attendances_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_shipments_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_bank_accounts_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_bank_transactions_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_ledger_entries_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_locker_storages_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_loadouts_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_market_listings_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_market_negotiations_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_tickets_fk";
ALTER TABLE "users_roles" ALTER COLUMN "value" SET DATA TYPE text;
DROP TYPE "public"."enum_users_roles";
CREATE TYPE "public"."enum_users_roles" AS ENUM('guest', 'user', 'admin', 'developer');
@ -828,7 +777,6 @@ export async function down({ db, payload, req }: MigrateDownArgs): Promise<void>
DROP INDEX "payload_locked_documents_rels_loadouts_id_idx";
DROP INDEX "payload_locked_documents_rels_market_listings_id_idx";
DROP INDEX "payload_locked_documents_rels_market_negotiations_id_idx";
DROP INDEX "payload_locked_documents_rels_tickets_id_idx";
ALTER TABLE "missions" ALTER COLUMN "game_details_game_setup_mission_file_id" SET NOT NULL;
ALTER TABLE "structures_auto_generated_resources" ALTER COLUMN "min_frequency" SET DEFAULT 1;
ALTER TABLE "missions_factions_involved" ADD COLUMN "faction_name" varchar NOT NULL;
@ -889,7 +837,6 @@ export async function down({ db, payload, req }: MigrateDownArgs): Promise<void>
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "loadouts_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "market_listings_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "market_negotiations_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "tickets_id";
ALTER TABLE "game_rules" DROP COLUMN "proximity_threshold";
ALTER TABLE "game_rules" DROP COLUMN "game_tick_interval_minutes";
ALTER TABLE "game_rules" DROP COLUMN "locker_grid_width";
@ -915,9 +862,5 @@ export async function down({ db, payload, req }: MigrateDownArgs): Promise<void>
DROP TYPE "public"."enum_market_negotiations_history_from";
DROP TYPE "public"."enum_market_negotiations_status";
DROP TYPE "public"."enum_market_negotiations_proposed_by";
DROP TYPE "public"."enum_tickets_activity_type";
DROP TYPE "public"."enum_tickets_category";
DROP TYPE "public"."enum_tickets_priority";
DROP TYPE "public"."enum_tickets_status";
DROP TYPE "public"."enum_narrative_events_triggers_type";`)
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,105 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_tickets_activity_type" AS ENUM('system', 'agent_message', 'client_message');
CREATE TYPE "public"."enum_tickets_category" AS ENUM('bug_report', 'feature_request', 'support_request', 'other');
CREATE TYPE "public"."enum_tickets_priority" AS ENUM('low', 'medium', 'high', 'critical');
CREATE TYPE "public"."enum_tickets_status" AS ENUM('open', 'in_review', 'planning', 'in_progress', 'waiting_on_reporter', 'in_testing', 'resolved', 'canceled', 'closed');
ALTER TYPE "public"."enum_game_event_logs_target_collection" ADD VALUE 'tickets';
ALTER TYPE "public"."enum_users_preferences_notifications_muted_types" ADD VALUE 'ticket:created';
ALTER TYPE "public"."enum_users_preferences_notifications_muted_types" ADD VALUE 'ticket:assigned';
ALTER TYPE "public"."enum_users_preferences_notifications_muted_types" ADD VALUE 'ticket:reply';
ALTER TYPE "public"."enum_users_preferences_notifications_muted_types" ADD VALUE 'ticket:status';
ALTER TYPE "public"."enum_users_preferences_discord_muted_types" ADD VALUE 'ticket:created';
ALTER TYPE "public"."enum_users_preferences_discord_muted_types" ADD VALUE 'ticket:assigned';
ALTER TYPE "public"."enum_users_preferences_discord_muted_types" ADD VALUE 'ticket:reply';
ALTER TYPE "public"."enum_users_preferences_discord_muted_types" ADD VALUE 'ticket:status';
CREATE TABLE "tickets_activity" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"type" "enum_tickets_activity_type" DEFAULT 'system' NOT NULL,
"content" jsonb NOT NULL,
"author_id" integer,
"created_at" timestamp(3) with time zone
);
CREATE TABLE "tickets" (
"id" serial PRIMARY KEY NOT NULL,
"title" varchar NOT NULL,
"description" jsonb NOT NULL,
"category" "enum_tickets_category" DEFAULT 'support_request' NOT NULL,
"priority" "enum_tickets_priority" DEFAULT 'medium' NOT NULL,
"status" "enum_tickets_status" DEFAULT 'open' NOT NULL,
"reporter_id" integer NOT NULL,
"assignee_id" integer,
"closed_at" timestamp(3) with time zone,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "tickets_id" integer;
ALTER TABLE "tickets_activity" ADD CONSTRAINT "tickets_activity_author_id_users_id_fk" FOREIGN KEY ("author_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "tickets_activity" ADD CONSTRAINT "tickets_activity_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."tickets"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "tickets" ADD CONSTRAINT "tickets_reporter_id_users_id_fk" FOREIGN KEY ("reporter_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "tickets" ADD CONSTRAINT "tickets_assignee_id_users_id_fk" FOREIGN KEY ("assignee_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
CREATE INDEX "tickets_activity_order_idx" ON "tickets_activity" USING btree ("_order");
CREATE INDEX "tickets_activity_parent_id_idx" ON "tickets_activity" USING btree ("_parent_id");
CREATE INDEX "tickets_activity_author_idx" ON "tickets_activity" USING btree ("author_id");
CREATE INDEX "tickets_category_idx" ON "tickets" USING btree ("category");
CREATE INDEX "tickets_priority_idx" ON "tickets" USING btree ("priority");
CREATE INDEX "tickets_status_idx" ON "tickets" USING btree ("status");
CREATE INDEX "tickets_reporter_idx" ON "tickets" USING btree ("reporter_id");
CREATE INDEX "tickets_assignee_idx" ON "tickets" USING btree ("assignee_id");
CREATE INDEX "tickets_updated_at_idx" ON "tickets" USING btree ("updated_at");
CREATE INDEX "tickets_created_at_idx" ON "tickets" USING btree ("created_at");
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_tickets_fk" FOREIGN KEY ("tickets_id") REFERENCES "public"."tickets"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "payload_locked_documents_rels_tickets_id_idx" ON "payload_locked_documents_rels" USING btree ("tickets_id");
ALTER TABLE "tickets_activity" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "tickets" DISABLE ROW LEVEL SECURITY;`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
DROP INDEX "payload_locked_documents_rels_tickets_id_idx";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_tickets_fk";
DROP INDEX "tickets_created_at_idx";
DROP INDEX "tickets_updated_at_idx";
DROP INDEX "tickets_assignee_idx";
DROP INDEX "tickets_reporter_idx";
DROP INDEX "tickets_status_idx";
DROP INDEX "tickets_priority_idx";
DROP INDEX "tickets_category_idx";
DROP INDEX "tickets_activity_author_idx";
DROP INDEX "tickets_activity_parent_id_idx";
DROP INDEX "tickets_activity_order_idx";
ALTER TABLE "tickets_activity" DROP CONSTRAINT "tickets_activity_author_id_users_id_fk";
ALTER TABLE "tickets_activity" DROP CONSTRAINT "tickets_activity_parent_id_fk";
ALTER TABLE "tickets" DROP CONSTRAINT "tickets_reporter_id_users_id_fk";
ALTER TABLE "tickets" DROP CONSTRAINT "tickets_assignee_id_users_id_fk";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "tickets_id";
DROP TABLE "tickets_activity" CASCADE;
DROP TABLE "tickets" CASCADE;
DROP TYPE "public"."enum_tickets_activity_type";
DROP TYPE "public"."enum_tickets_category";
DROP TYPE "public"."enum_tickets_priority";
DROP TYPE "public"."enum_tickets_status";
-- Note: the enum values added via ALTER TYPE ... ADD VALUE in up()
-- ('tickets', 'ticket:created', 'ticket:assigned', 'ticket:reply', 'ticket:status')
-- cannot be removed here: PostgreSQL does not support DROP VALUE.`)
}

View file

@ -5,6 +5,7 @@ import * as migration_20251222_200320 from './20251222_200320';
import * as migration_20251223_055859 from './20251223_055859';
import * as migration_20260109_065519 from './20260109_065519';
import * as migration_20260816_213455 from './20260816_213455';
import * as migration_20260816_220000 from './20260816_220000';
export const migrations = [
{
@ -40,6 +41,11 @@ export const migrations = [
{
up: migration_20260816_213455.up,
down: migration_20260816_213455.down,
name: '20260816_213455'
name: '20260816_213455',
},
{
up: migration_20260816_220000.up,
down: migration_20260816_220000.down,
name: '20260816_220000',
},
];