feat(migrations): reconcile user_cards UNIQUE constraint per Option A (B6) #149

Merged
varutasu merged 2 commits from convoy/reconcile-b6-user-cards-unique into main 2026-06-14 09:18:23 -04:00
Showing only changes of commit a000c59ec4 - Show all commits

View file

@ -64,17 +64,25 @@ export const up = (pgm) => {
// Re-assert the canonical 3-col UNIQUE from `initial-schema.js`. // Re-assert the canonical 3-col UNIQUE from `initial-schema.js`.
// No-op against initial-schema-applied envs (the constraint already // No-op against initial-schema-applied envs (the constraint already
// exists under its auto-generated name); constructive against any // exists under its auto-generated name); constructive against any
// env where the constraint was somehow dropped. Wrapped in // env where the constraint was somehow dropped. Postgres does not
// `DO $$ ... EXCEPTION WHEN duplicate_object` because Postgres // support `ADD CONSTRAINT ... IF NOT EXISTS`, so we pre-check
// does not support `ADD CONSTRAINT ... IF NOT EXISTS`. // `pg_constraint`. (An earlier draft used `EXCEPTION WHEN
// duplicate_object`, but `ADD CONSTRAINT UNIQUE` raises
// SQLSTATE 42P07 `duplicate_table` from the auto-created
// supporting index, not 42710 `duplicate_object` — the pre-check
// sidesteps both.)
pgm.sql(` pgm.sql(`
DO $$ DO $$
BEGIN BEGIN
ALTER TABLE user_cards IF NOT EXISTS (
ADD CONSTRAINT user_cards_user_id_card_id_is_foil_key SELECT 1 FROM pg_constraint
UNIQUE (user_id, card_id, is_foil); WHERE conname = 'user_cards_user_id_card_id_is_foil_key'
EXCEPTION AND conrelid = 'user_cards'::regclass
WHEN duplicate_object THEN NULL; ) THEN
ALTER TABLE user_cards
ADD CONSTRAINT user_cards_user_id_card_id_is_foil_key
UNIQUE (user_id, card_id, is_foil);
END IF;
END $$; END $$;
`); `);
}; };