Fixes https://github.com/payloadcms/payload/issues/12136 which caused by regression from https://github.com/payloadcms/payload/pull/11995 The previous PR solved an issue where the generated drizzle relation name was too long because of Payload field names, for example ``` { name: 'thisIsALongFieldNameThatWillCauseAPostgresErrorEvenThoughWeSetAShorterDBName', dbName: 'shortname', type: 'array', fields: [ { name: 'nested_field_1', type: 'array', dbName: 'short_nested_1', fields: [], }, { name: 'nested_field_2', type: 'text', }, ], }, ``` But it caused regression, when custom `dbName` vice versa caused long relation names: ``` export const Header: GlobalConfig = { slug: 'header', fields: [ { name: 'itemsLvl1', type: 'array', dbName: 'header_items_lvl1', fields: [ { name: 'label', type: 'text', }, { name: 'itemsLvl2', type: 'array', dbName: 'header_items_lvl2', fields: [ { name: 'label', type: 'text', }, { name: 'itemsLvl3', type: 'array', dbName: 'header_items_lvl3', fields: [ { name: 'label', type: 'text', }, { name: 'itemsLvl4', type: 'array', dbName: 'header_items_lvl4', fields: [ { name: 'label', type: 'text', }, ], }, ], }, ], }, ], }, ], } ``` Notice if you calculate the generated relation name for `itemsLvl4` you get: `header__header_items_lvl1__header_items_lvl2__header_items_lvl3_header_items_lvl4` - 81 characters, Drizzle, for joining shrink the alias to 63 characters -`header__header_items_lvl1__header_items_lvl2__header_items_lvl3` and Postgres throws: ``` error: table name "header__header_items_lvl1__header_items_lvl2__header_items_lvl3" specified more than once ```
113 lines
5.5 KiB
TypeScript
113 lines
5.5 KiB
TypeScript
import type { MigrateDownArgs, MigrateUpArgs} from '@payloadcms/db-postgres';
|
|
|
|
import { sql } from '@payloadcms/db-postgres'
|
|
|
|
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
|
|
await db.execute(sql`
|
|
CREATE TABLE IF NOT EXISTS "users" (
|
|
"id" serial PRIMARY KEY NOT NULL,
|
|
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
"email" varchar NOT NULL,
|
|
"reset_password_token" varchar,
|
|
"reset_password_expiration" timestamp(3) with time zone,
|
|
"salt" varchar,
|
|
"hash" varchar,
|
|
"login_attempts" numeric DEFAULT 0,
|
|
"lock_until" timestamp(3) with time zone
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS "payload_locked_documents" (
|
|
"id" serial PRIMARY KEY NOT NULL,
|
|
"global_slug" 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 IF NOT EXISTS "payload_locked_documents_rels" (
|
|
"id" serial PRIMARY KEY NOT NULL,
|
|
"order" integer,
|
|
"parent_id" integer NOT NULL,
|
|
"path" varchar NOT NULL,
|
|
"users_id" integer
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS "payload_preferences" (
|
|
"id" serial PRIMARY KEY NOT NULL,
|
|
"key" varchar,
|
|
"value" jsonb,
|
|
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS "payload_preferences_rels" (
|
|
"id" serial PRIMARY KEY NOT NULL,
|
|
"order" integer,
|
|
"parent_id" integer NOT NULL,
|
|
"path" varchar NOT NULL,
|
|
"users_id" integer
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS "payload_migrations" (
|
|
"id" serial PRIMARY KEY NOT NULL,
|
|
"name" varchar,
|
|
"batch" numeric,
|
|
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
|
|
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
|
|
);
|
|
|
|
DO $$ BEGIN
|
|
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_locked_documents"("id") ON DELETE cascade ON UPDATE no action;
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
DO $$ BEGIN
|
|
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
DO $$ BEGIN
|
|
ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_preferences"("id") ON DELETE cascade ON UPDATE no action;
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
DO $$ BEGIN
|
|
ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
CREATE INDEX IF NOT EXISTS "users_updated_at_idx" ON "users" USING btree ("updated_at");
|
|
CREATE INDEX IF NOT EXISTS "users_created_at_idx" ON "users" USING btree ("created_at");
|
|
CREATE UNIQUE INDEX IF NOT EXISTS "users_email_idx" ON "users" USING btree ("email");
|
|
CREATE INDEX IF NOT EXISTS "payload_locked_documents_global_slug_idx" ON "payload_locked_documents" USING btree ("global_slug");
|
|
CREATE INDEX IF NOT EXISTS "payload_locked_documents_updated_at_idx" ON "payload_locked_documents" USING btree ("updated_at");
|
|
CREATE INDEX IF NOT EXISTS "payload_locked_documents_created_at_idx" ON "payload_locked_documents" USING btree ("created_at");
|
|
CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_order_idx" ON "payload_locked_documents_rels" USING btree ("order");
|
|
CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_parent_idx" ON "payload_locked_documents_rels" USING btree ("parent_id");
|
|
CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_path_idx" ON "payload_locked_documents_rels" USING btree ("path");
|
|
CREATE INDEX IF NOT EXISTS "payload_locked_documents_rels_users_id_idx" ON "payload_locked_documents_rels" USING btree ("users_id");
|
|
CREATE INDEX IF NOT EXISTS "payload_preferences_key_idx" ON "payload_preferences" USING btree ("key");
|
|
CREATE INDEX IF NOT EXISTS "payload_preferences_updated_at_idx" ON "payload_preferences" USING btree ("updated_at");
|
|
CREATE INDEX IF NOT EXISTS "payload_preferences_created_at_idx" ON "payload_preferences" USING btree ("created_at");
|
|
CREATE INDEX IF NOT EXISTS "payload_preferences_rels_order_idx" ON "payload_preferences_rels" USING btree ("order");
|
|
CREATE INDEX IF NOT EXISTS "payload_preferences_rels_parent_idx" ON "payload_preferences_rels" USING btree ("parent_id");
|
|
CREATE INDEX IF NOT EXISTS "payload_preferences_rels_path_idx" ON "payload_preferences_rels" USING btree ("path");
|
|
CREATE INDEX IF NOT EXISTS "payload_preferences_rels_users_id_idx" ON "payload_preferences_rels" USING btree ("users_id");
|
|
CREATE INDEX IF NOT EXISTS "payload_migrations_updated_at_idx" ON "payload_migrations" USING btree ("updated_at");
|
|
CREATE INDEX IF NOT EXISTS "payload_migrations_created_at_idx" ON "payload_migrations" USING btree ("created_at");`)
|
|
}
|
|
|
|
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
|
|
await db.execute(sql`
|
|
DROP TABLE "users" CASCADE;
|
|
DROP TABLE "payload_locked_documents" CASCADE;
|
|
DROP TABLE "payload_locked_documents_rels" CASCADE;
|
|
DROP TABLE "payload_preferences" CASCADE;
|
|
DROP TABLE "payload_preferences_rels" CASCADE;
|
|
DROP TABLE "payload_migrations" CASCADE;`)
|
|
}
|