import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres' export async function up({ db, payload, req }: MigrateUpArgs): Promise { await db.execute(sql` CREATE TYPE "public"."enum_tickets_type" AS ENUM('task', 'bug', 'story', 'epic', 'improvement'); CREATE TYPE "public"."enum_tickets_resolution" AS ENUM('fixed', 'wontfix', 'duplicate', 'invalid'); CREATE TYPE "public"."enum_projects_status" AS ENUM('active', 'archived'); CREATE TYPE "public"."enum_sprints_status" AS ENUM('planning', 'active', 'completed'); CREATE TYPE "public"."enum_releases_status" AS ENUM('draft', 'in_progress', 'released'); ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'projects:create' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'projects:read' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'projects:update' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'projects:delete' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'labels:create' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'labels:read' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'labels:update' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'labels:delete' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'sprints:create' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'sprints:read' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'sprints:update' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'sprints:delete' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'releases:create' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'releases:read' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'releases:update' BEFORE 'tickets:create'; ALTER TYPE "public"."enum_roles_permissions" ADD VALUE 'releases:delete' BEFORE 'tickets:create'; CREATE TABLE "tickets_rels" ( "id" serial PRIMARY KEY NOT NULL, "order" integer, "parent_id" integer NOT NULL, "path" varchar NOT NULL, "labels_id" integer ); CREATE TABLE "projects" ( "id" serial PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "key" varchar NOT NULL, "description" jsonb, "lead_id" integer, "status" "enum_projects_status" DEFAULT 'active', "default_assignee_id" integer, "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL ); CREATE TABLE "sprints" ( "id" serial PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "project_id" integer NOT NULL, "goal" varchar, "start_date" timestamp(3) with time zone, "end_date" timestamp(3) with time zone, "status" "enum_sprints_status" DEFAULT 'planning', "capacity" numeric, "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL ); CREATE TABLE "releases" ( "id" serial PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "project_id" integer NOT NULL, "description" jsonb, "status" "enum_releases_status" DEFAULT 'draft', "release_date" timestamp(3) with time zone, "target_version" varchar, "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL ); CREATE TABLE "labels" ( "id" serial PRIMARY KEY NOT NULL, "name" varchar NOT NULL, "color" varchar DEFAULT '#6366f1', "project_id" integer, "updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL, "created_at" timestamp(3) with time zone DEFAULT now() NOT NULL ); ALTER TABLE "tickets" ADD COLUMN "project_id" integer; ALTER TABLE "tickets" ADD COLUMN "sprint_id" integer; ALTER TABLE "tickets" ADD COLUMN "release_id" integer; ALTER TABLE "tickets" ADD COLUMN "parent_ticket_id" integer; ALTER TABLE "tickets" ADD COLUMN "type" "enum_tickets_type" DEFAULT 'task'; ALTER TABLE "tickets" ADD COLUMN "story_points" numeric; ALTER TABLE "tickets" ADD COLUMN "estimate" numeric; ALTER TABLE "tickets" ADD COLUMN "start_date" timestamp(3) with time zone; ALTER TABLE "tickets" ADD COLUMN "due_date" timestamp(3) with time zone; ALTER TABLE "tickets" ADD COLUMN "resolution" "enum_tickets_resolution"; ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "projects_id" integer; ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "sprints_id" integer; ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "releases_id" integer; ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "labels_id" integer; ALTER TABLE "tickets_rels" ADD CONSTRAINT "tickets_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."tickets"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "tickets_rels" ADD CONSTRAINT "tickets_rels_labels_fk" FOREIGN KEY ("labels_id") REFERENCES "public"."labels"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "projects" ADD CONSTRAINT "projects_lead_id_users_id_fk" FOREIGN KEY ("lead_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "projects" ADD CONSTRAINT "projects_default_assignee_id_users_id_fk" FOREIGN KEY ("default_assignee_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "sprints" ADD CONSTRAINT "sprints_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "releases" ADD CONSTRAINT "releases_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "labels" ADD CONSTRAINT "labels_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE set null ON UPDATE no action; CREATE INDEX "tickets_rels_order_idx" ON "tickets_rels" USING btree ("order"); CREATE INDEX "tickets_rels_parent_idx" ON "tickets_rels" USING btree ("parent_id"); CREATE INDEX "tickets_rels_path_idx" ON "tickets_rels" USING btree ("path"); CREATE INDEX "tickets_rels_labels_id_idx" ON "tickets_rels" USING btree ("labels_id"); CREATE UNIQUE INDEX "projects_key_idx" ON "projects" USING btree ("key"); CREATE INDEX "projects_lead_idx" ON "projects" USING btree ("lead_id"); CREATE INDEX "projects_default_assignee_idx" ON "projects" USING btree ("default_assignee_id"); CREATE INDEX "projects_updated_at_idx" ON "projects" USING btree ("updated_at"); CREATE INDEX "projects_created_at_idx" ON "projects" USING btree ("created_at"); CREATE INDEX "sprints_project_idx" ON "sprints" USING btree ("project_id"); CREATE INDEX "sprints_updated_at_idx" ON "sprints" USING btree ("updated_at"); CREATE INDEX "sprints_created_at_idx" ON "sprints" USING btree ("created_at"); CREATE INDEX "releases_project_idx" ON "releases" USING btree ("project_id"); CREATE INDEX "releases_updated_at_idx" ON "releases" USING btree ("updated_at"); CREATE INDEX "releases_created_at_idx" ON "releases" USING btree ("created_at"); CREATE INDEX "labels_project_idx" ON "labels" USING btree ("project_id"); CREATE INDEX "labels_updated_at_idx" ON "labels" USING btree ("updated_at"); CREATE INDEX "labels_created_at_idx" ON "labels" USING btree ("created_at"); ALTER TABLE "tickets" ADD CONSTRAINT "tickets_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "tickets" ADD CONSTRAINT "tickets_sprint_id_sprints_id_fk" FOREIGN KEY ("sprint_id") REFERENCES "public"."sprints"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "tickets" ADD CONSTRAINT "tickets_release_id_releases_id_fk" FOREIGN KEY ("release_id") REFERENCES "public"."releases"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "tickets" ADD CONSTRAINT "tickets_parent_ticket_id_tickets_id_fk" FOREIGN KEY ("parent_ticket_id") REFERENCES "public"."tickets"("id") ON DELETE set null ON UPDATE no action; ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_projects_fk" FOREIGN KEY ("projects_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_sprints_fk" FOREIGN KEY ("sprints_id") REFERENCES "public"."sprints"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_releases_fk" FOREIGN KEY ("releases_id") REFERENCES "public"."releases"("id") ON DELETE cascade ON UPDATE no action; ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_labels_fk" FOREIGN KEY ("labels_id") REFERENCES "public"."labels"("id") ON DELETE cascade ON UPDATE no action; CREATE INDEX "tickets_project_idx" ON "tickets" USING btree ("project_id"); CREATE INDEX "tickets_sprint_idx" ON "tickets" USING btree ("sprint_id"); CREATE INDEX "tickets_release_idx" ON "tickets" USING btree ("release_id"); CREATE INDEX "tickets_parent_ticket_idx" ON "tickets" USING btree ("parent_ticket_id"); CREATE INDEX "payload_locked_documents_rels_projects_id_idx" ON "payload_locked_documents_rels" USING btree ("projects_id"); CREATE INDEX "payload_locked_documents_rels_sprints_id_idx" ON "payload_locked_documents_rels" USING btree ("sprints_id"); CREATE INDEX "payload_locked_documents_rels_releases_id_idx" ON "payload_locked_documents_rels" USING btree ("releases_id"); CREATE INDEX "payload_locked_documents_rels_labels_id_idx" ON "payload_locked_documents_rels" USING btree ("labels_id");`) } export async function down({ db, payload, req }: MigrateDownArgs): Promise { await db.execute(sql` ALTER TABLE "tickets_rels" DISABLE ROW LEVEL SECURITY; ALTER TABLE "projects" DISABLE ROW LEVEL SECURITY; ALTER TABLE "sprints" DISABLE ROW LEVEL SECURITY; ALTER TABLE "releases" DISABLE ROW LEVEL SECURITY; ALTER TABLE "labels" DISABLE ROW LEVEL SECURITY; DROP TABLE "tickets_rels" CASCADE; DROP TABLE "projects" CASCADE; DROP TABLE "sprints" CASCADE; DROP TABLE "releases" CASCADE; DROP TABLE "labels" CASCADE; ALTER TABLE "tickets" DROP CONSTRAINT "tickets_project_id_projects_id_fk"; ALTER TABLE "tickets" DROP CONSTRAINT "tickets_sprint_id_sprints_id_fk"; ALTER TABLE "tickets" DROP CONSTRAINT "tickets_release_id_releases_id_fk"; ALTER TABLE "tickets" DROP CONSTRAINT "tickets_parent_ticket_id_tickets_id_fk"; ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_projects_fk"; ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_sprints_fk"; ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_releases_fk"; ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_labels_fk"; ALTER TABLE "roles_permissions" ALTER COLUMN "value" SET DATA TYPE text; DROP TYPE "public"."enum_roles_permissions"; CREATE TYPE "public"."enum_roles_permissions" AS ENUM('system:admin-access', 'users:create', 'users:read', 'users:update', 'users:delete', 'users:unlock', 'users:assign-roles', 'ranks:create', 'ranks:read', 'ranks:update', 'ranks:delete', 'profiles:create', 'profiles:read', 'profiles:update', 'profiles:delete', 'awards:create', 'awards:read', 'awards:update', 'awards:delete', 'qualifications:create', 'qualifications:read', 'qualifications:update', 'qualifications:delete', 'assignments:create', 'assignments:read', 'assignments:update', 'assignments:delete', 'experience:create', 'experience:read', 'experience:update', 'experience:delete', 'user-notifications:create', 'user-notifications:read', 'user-notifications:update', 'user-notifications:delete', 'missions:create', 'missions:read', 'missions:update', 'missions:delete', 'missions:read-sensitive', 'mission-attendances:create', 'mission-attendances:read', 'mission-attendances:update', 'mission-attendances:delete', 'campaigns:create', 'campaigns:read', 'campaigns:update', 'campaigns:delete', 'factions:create', 'factions:read', 'factions:update', 'factions:delete', 'technologies:create', 'technologies:read', 'technologies:update', 'technologies:delete', 'assets:create', 'assets:read', 'assets:update', 'assets:delete', 'resources:create', 'resources:read', 'resources:update', 'resources:delete', 'vehicles:create', 'vehicles:read', 'vehicles:update', 'vehicles:delete', 'structures:create', 'structures:read', 'structures:update', 'structures:delete', 'shipments:create', 'shipments:read', 'shipments:update', 'shipments:delete', 'bank-accounts:create', 'bank-accounts:read', 'bank-accounts:update', 'bank-accounts:delete', 'bank-transactions:create', 'bank-transactions:read', 'bank-transactions:update', 'bank-transactions:delete', 'ledger-entries:create', 'ledger-entries:read', 'ledger-entries:update', 'ledger-entries:delete', 'locker-storages:create', 'locker-storages:read', 'locker-storages:update', 'locker-storages:delete', 'loadouts:create', 'loadouts:read', 'loadouts:update', 'loadouts:delete', 'market-listings:create', 'market-listings:read', 'market-listings:update', 'market-listings:delete', 'market-negotiations:create', 'market-negotiations:read', 'market-negotiations:update', 'market-negotiations:delete', 'tickets:create', 'tickets:read', 'tickets:update', 'tickets:delete', 'game-structures:create', 'game-structures:read', 'game-structures:update', 'game-structures:delete', 'game-vehicles:create', 'game-vehicles:read', 'game-vehicles:update', 'game-vehicles:delete', 'game-npcs:create', 'game-npcs:read', 'game-npcs:update', 'game-npcs:delete', 'game-hard-resources:create', 'game-hard-resources:read', 'game-hard-resources:update', 'game-hard-resources:delete', 'game-event-logs:create', 'game-event-logs:read', 'game-event-logs:update', 'game-event-logs:delete', 'maps:create', 'maps:read', 'maps:update', 'maps:delete', 'narrative-events:create', 'narrative-events:read', 'narrative-events:update', 'narrative-events:delete', 'mission-files:create', 'mission-files:read', 'mission-files:update', 'mission-files:delete', 'mod-lists:create', 'mod-lists:read', 'mod-lists:update', 'mod-lists:delete', 'game-rules:read', 'game-rules:update', 'shims:read', 'shims:update', 'logistics:manage', 'intelligence:manage', 'profiles:intel_excerpt:update', 'banking:manage', 'tickets:staff', 'discord:staff', 'discord:announce'); ALTER TABLE "roles_permissions" ALTER COLUMN "value" SET DATA TYPE "public"."enum_roles_permissions" USING "value"::"public"."enum_roles_permissions"; DROP INDEX "tickets_project_idx"; DROP INDEX "tickets_sprint_idx"; DROP INDEX "tickets_release_idx"; DROP INDEX "tickets_parent_ticket_idx"; DROP INDEX "payload_locked_documents_rels_projects_id_idx"; DROP INDEX "payload_locked_documents_rels_sprints_id_idx"; DROP INDEX "payload_locked_documents_rels_releases_id_idx"; DROP INDEX "payload_locked_documents_rels_labels_id_idx"; ALTER TABLE "tickets" DROP COLUMN "project_id"; ALTER TABLE "tickets" DROP COLUMN "sprint_id"; ALTER TABLE "tickets" DROP COLUMN "release_id"; ALTER TABLE "tickets" DROP COLUMN "parent_ticket_id"; ALTER TABLE "tickets" DROP COLUMN "type"; ALTER TABLE "tickets" DROP COLUMN "story_points"; ALTER TABLE "tickets" DROP COLUMN "estimate"; ALTER TABLE "tickets" DROP COLUMN "start_date"; ALTER TABLE "tickets" DROP COLUMN "due_date"; ALTER TABLE "tickets" DROP COLUMN "resolution"; ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "projects_id"; ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "sprints_id"; ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "releases_id"; ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "labels_id"; DROP TYPE "public"."enum_tickets_type"; DROP TYPE "public"."enum_tickets_resolution"; DROP TYPE "public"."enum_projects_status"; DROP TYPE "public"."enum_sprints_status"; DROP TYPE "public"."enum_releases_status";`) }