diff --git a/src/migrations/20260305_215000_products_featured_image.ts b/src/migrations/20260305_215000_products_featured_image.ts new file mode 100644 index 00000000..c740c8ac --- /dev/null +++ b/src/migrations/20260305_215000_products_featured_image.ts @@ -0,0 +1,52 @@ +import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'; + +export async function up({ db }: MigrateUpArgs): Promise { + // Add featured_image_id to products and _products_v + await db.execute(sql` + ALTER TABLE "products" ADD COLUMN IF NOT EXISTS "featured_image_id" integer; + `); + await db.execute(sql` + ALTER TABLE "_products_v" ADD COLUMN IF NOT EXISTS "version_featured_image_id" integer; + `); + + // Add foreign key constraints + await db.execute(sql` + DO $$ BEGIN + ALTER TABLE "products" ADD CONSTRAINT "products_featured_image_id_media_id_fk" FOREIGN KEY ("featured_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action; + EXCEPTION WHEN duplicate_object THEN null; END $$; + `); + await db.execute(sql` + DO $$ BEGIN + ALTER TABLE "_products_v" ADD CONSTRAINT "_products_v_version_featured_image_id_media_id_fk" FOREIGN KEY ("version_featured_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action; + EXCEPTION WHEN duplicate_object THEN null; END $$; + `); + + // Add indexes + await db.execute(sql` + CREATE INDEX IF NOT EXISTS "products_featured_image_idx" ON "products" USING btree ("featured_image_id"); + `); + await db.execute(sql` + CREATE INDEX IF NOT EXISTS "_products_v_version_version_featured_image_idx" ON "_products_v" USING btree ("version_featured_image_id"); + `); +} + +export async function down({ db }: MigrateDownArgs): Promise { + await db.execute(sql` + ALTER TABLE "products" DROP CONSTRAINT IF EXISTS "products_featured_image_id_media_id_fk"; + `); + await db.execute(sql` + ALTER TABLE "_products_v" DROP CONSTRAINT IF EXISTS "_products_v_version_featured_image_id_media_id_fk"; + `); + await db.execute(sql` + DROP INDEX IF EXISTS "products_featured_image_idx"; + `); + await db.execute(sql` + DROP INDEX IF EXISTS "_products_v_version_version_featured_image_idx"; + `); + await db.execute(sql` + ALTER TABLE "products" DROP COLUMN IF EXISTS "featured_image_id"; + `); + await db.execute(sql` + ALTER TABLE "_products_v" DROP COLUMN IF EXISTS "version_featured_image_id"; + `); +} diff --git a/src/migrations/index.ts b/src/migrations/index.ts index 644c12ec..99f15c7b 100644 --- a/src/migrations/index.ts +++ b/src/migrations/index.ts @@ -2,6 +2,7 @@ import * as migration_20260223_195005_products_collection from './20260223_19500 import * as migration_20260223_195151_remove_sku_unique from './20260223_195151_remove_sku_unique'; import * as migration_20260225_003500_add_pages_collection from './20260225_003500_add_pages_collection'; import * as migration_20260225_175000_native_localization from './20260225_175000_native_localization'; +import * as migration_20260305_215000_products_featured_image from './20260305_215000_products_featured_image'; export const migrations = [ { @@ -24,4 +25,9 @@ export const migrations = [ down: migration_20260225_175000_native_localization.down, name: '20260225_175000_native_localization', }, + { + up: migration_20260305_215000_products_featured_image.up, + down: migration_20260305_215000_products_featured_image.down, + name: '20260305_215000_products_featured_image', + }, ];