From 9dc2e73e381736e3e546564521cde91cb1f56a7b Mon Sep 17 00:00:00 2001 From: idubnori Date: Wed, 8 Oct 2025 02:42:40 +0200 Subject: [PATCH] fix: schema migration fails --- ...s => 1759883700247-AlbumAssetsActivity.ts} | 24 +++++++++---------- server/src/schema/tables/activity.table.ts | 1 + 2 files changed, 12 insertions(+), 13 deletions(-) rename server/src/schema/migrations/{1759817260868-AddAssetIdsIntoActivity.ts => 1759883700247-AlbumAssetsActivity.ts} (86%) diff --git a/server/src/schema/migrations/1759817260868-AddAssetIdsIntoActivity.ts b/server/src/schema/migrations/1759883700247-AlbumAssetsActivity.ts similarity index 86% rename from server/src/schema/migrations/1759817260868-AddAssetIdsIntoActivity.ts rename to server/src/schema/migrations/1759883700247-AlbumAssetsActivity.ts index 17acc5da50..2b80e8159d 100644 --- a/server/src/schema/migrations/1759817260868-AddAssetIdsIntoActivity.ts +++ b/server/src/schema/migrations/1759883700247-AlbumAssetsActivity.ts @@ -1,12 +1,6 @@ import { Kysely, sql } from 'kysely'; export async function up(db: Kysely): Promise { - await sql`ALTER TABLE "activity" DROP CONSTRAINT "activity_like_check";`.execute(db); - await sql`ALTER TABLE "activity" ADD "assetIds" uuid[];`.execute(db); - await sql`CREATE INDEX "activity_assetIds_idx" ON "activity" ("assetIds");`.execute(db); - await sql`ALTER TABLE "activity" ADD CONSTRAINT "activity_check" CHECK ((comment IS NULL AND "isLiked" = true) OR (comment IS NOT NULL AND "isLiked" = false) OR (comment IS NULL AND "isLiked" = false AND "assetIds" IS NOT NULL));`.execute( - db, - ); await sql`CREATE OR REPLACE FUNCTION activity_assetids_update_on_albumasset_delete() RETURNS TRIGGER LANGUAGE PLPGSQL @@ -22,22 +16,32 @@ export async function up(db: Kysely): Promise { RETURN NULL; END; $$;`.execute(db); + await sql`ALTER TABLE "activity" DROP CONSTRAINT "activity_like_check";`.execute(db); + await sql`ALTER TABLE "activity" ADD "assetIds" uuid[];`.execute(db); await sql`CREATE OR REPLACE TRIGGER "activity_assetids_update_on_albumasset_delete" AFTER DELETE ON "album_asset" REFERENCING OLD TABLE AS "old" FOR EACH STATEMENT WHEN (pg_trigger_depth() <= 1) EXECUTE FUNCTION activity_assetids_update_on_albumasset_delete();`.execute(db); - await sql`INSERT INTO "migration_overrides" ("name", "value") VALUES ('function_activity_assetids_update_on_albumasset_delete', '{"type":"function","name":"activity_assetids_update_on_albumasset_delete","sql":"CREATE OR REPLACE FUNCTION activity_assetids_update_on_albumasset_delete()\\n RETURNS TRIGGER\\n LANGUAGE PLPGSQL\\n AS $$\\n BEGIN\\n UPDATE activity\\n SET \\"assetIds\\" = array_remove(\\"assetIds\\", OLD.\\"assetsId\\")\\n WHERE \\"albumId\\" = OLD.\\"albumsId\\" AND \\"assetIds\\" IS NOT NULL AND OLD.\\"assetsId\\" = ANY(\\"assetIds\\");\\n RETURN NULL;\\n END;\\n $$;"}'::jsonb);`.execute( + await sql`INSERT INTO "migration_overrides" ("name", "value") VALUES ('function_activity_assetids_update_on_albumasset_delete', '{"type":"function","name":"activity_assetids_update_on_albumasset_delete","sql":"CREATE OR REPLACE FUNCTION activity_assetids_update_on_albumasset_delete()\\n RETURNS TRIGGER\\n LANGUAGE PLPGSQL\\n AS $$\\n DECLARE\\n r RECORD;\\n BEGIN\\n FOR r IN SELECT \\"albumsId\\", \\"assetsId\\" FROM old LOOP\\n UPDATE activity\\n SET \\"assetIds\\" = array_remove(\\"assetIds\\", r.\\"assetsId\\")\\n WHERE \\"albumId\\" = r.\\"albumsId\\" AND \\"assetIds\\" IS NOT NULL AND r.\\"assetsId\\" = ANY(\\"assetIds\\");\\n END LOOP;\\n RETURN NULL;\\n END;\\n $$;"}'::jsonb);`.execute( db, ); await sql`INSERT INTO "migration_overrides" ("name", "value") VALUES ('trigger_activity_assetids_update_on_albumasset_delete', '{"type":"trigger","name":"activity_assetids_update_on_albumasset_delete","sql":"CREATE OR REPLACE TRIGGER \\"activity_assetids_update_on_albumasset_delete\\"\\n AFTER DELETE ON \\"album_asset\\"\\n REFERENCING OLD TABLE AS \\"old\\"\\n FOR EACH STATEMENT\\n WHEN (pg_trigger_depth() <= 1)\\n EXECUTE FUNCTION activity_assetids_update_on_albumasset_delete();"}'::jsonb);`.execute( db, ); + await sql`ALTER TABLE "activity" ADD CONSTRAINT "activity_check" CHECK ((comment IS NULL AND "isLiked" = true) OR (comment IS NOT NULL AND "isLiked" = false) OR (comment IS NULL AND "isLiked" = false AND "assetIds" IS NOT NULL));`.execute( + db, + ); } export async function down(db: Kysely): Promise { + await sql`ALTER TABLE "activity" DROP CONSTRAINT "activity_check";`.execute(db); await sql`DROP TRIGGER "activity_assetids_update_on_albumasset_delete" ON "album_asset";`.execute(db); + await sql`ALTER TABLE "activity" ADD CONSTRAINT "activity_like_check" CHECK (((((comment IS NULL) AND ("isLiked" = true)) OR ((comment IS NOT NULL) AND ("isLiked" = false)))));`.execute( + db, + ); + await sql`ALTER TABLE "activity" DROP COLUMN "assetIds";`.execute(db); await sql`DROP FUNCTION activity_assetids_update_on_albumasset_delete;`.execute(db); await sql`DELETE FROM "migration_overrides" WHERE "name" = 'function_activity_assetids_update_on_albumasset_delete';`.execute( db, @@ -45,10 +49,4 @@ export async function down(db: Kysely): Promise { await sql`DELETE FROM "migration_overrides" WHERE "name" = 'trigger_activity_assetids_update_on_albumasset_delete';`.execute( db, ); - await sql`ALTER TABLE "activity" DROP CONSTRAINT "activity_check";`.execute(db); - await sql`DROP INDEX "activity_assetIds_idx";`.execute(db); - await sql`ALTER TABLE "activity" DROP COLUMN "assetIds";`.execute(db); - await sql`ALTER TABLE "activity" ADD CONSTRAINT "activity_like_check" CHECK (((((comment IS NULL) AND ("isLiked" = true)) OR ((comment IS NOT NULL) AND ("isLiked" = false)))));`.execute( - db, - ); } diff --git a/server/src/schema/tables/activity.table.ts b/server/src/schema/tables/activity.table.ts index 7da65628ff..34ba8cb23c 100644 --- a/server/src/schema/tables/activity.table.ts +++ b/server/src/schema/tables/activity.table.ts @@ -55,6 +55,7 @@ export class ActivityTable { @ForeignKeyColumn(() => AssetTable, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: true }) assetId!: string | null; + @Column({ array: true, type: 'uuid', default: null }) assetIds!: string[] | null; @Column({ type: 'text', default: null })