-- Migration 019: relax user FKs so account deletion (Fase 10.5) works. -- -- Spec (§6.3): deleting a user account must NOT delete the content they -- created in collectives. Several `created_by`/`updated_by` FKs were -- declared `NOT NULL REFERENCES public.users(id) ON DELETE RESTRICT`, -- which would block delete_account() whenever the user has ever created -- a list, task, note, etc. -- -- This migration: -- * drops the offending RESTRICT FKs, drops the NOT NULL, re-adds them -- as `ON DELETE SET NULL` -- * relaxes `collectives.created_by` likewise (the orphaned collective -- becomes "created by deleted user") -- * relaxes `collective_invitations.created_by` from CASCADE → SET NULL -- so existing invitations survive the creator's account deletion -- -- Reads of these columns in the UI should defensively show -- "Deleted user" when null. -- ── public.collectives ─────────────────────────────────────────────────────── ALTER TABLE public.collectives DROP CONSTRAINT collectives_created_by_fkey; ALTER TABLE public.collectives ALTER COLUMN created_by DROP NOT NULL; ALTER TABLE public.collectives ADD CONSTRAINT collectives_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL; -- ── public.collective_invitations ──────────────────────────────────────────── ALTER TABLE public.collective_invitations DROP CONSTRAINT collective_invitations_created_by_fkey; ALTER TABLE public.collective_invitations ALTER COLUMN created_by DROP NOT NULL; ALTER TABLE public.collective_invitations ADD CONSTRAINT collective_invitations_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL; -- ── public.shopping_lists ──────────────────────────────────────────────────── ALTER TABLE public.shopping_lists DROP CONSTRAINT shopping_lists_created_by_fkey; ALTER TABLE public.shopping_lists ALTER COLUMN created_by DROP NOT NULL; ALTER TABLE public.shopping_lists ADD CONSTRAINT shopping_lists_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL; -- ── public.shopping_items ──────────────────────────────────────────────────── ALTER TABLE public.shopping_items DROP CONSTRAINT shopping_items_created_by_fkey; ALTER TABLE public.shopping_items ALTER COLUMN created_by DROP NOT NULL; ALTER TABLE public.shopping_items ADD CONSTRAINT shopping_items_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL; -- ── public.task_lists ──────────────────────────────────────────────────────── ALTER TABLE public.task_lists DROP CONSTRAINT task_lists_created_by_fkey; ALTER TABLE public.task_lists ALTER COLUMN created_by DROP NOT NULL; ALTER TABLE public.task_lists ADD CONSTRAINT task_lists_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL; -- ── public.tasks ───────────────────────────────────────────────────────────── ALTER TABLE public.tasks DROP CONSTRAINT tasks_created_by_fkey; ALTER TABLE public.tasks ALTER COLUMN created_by DROP NOT NULL; ALTER TABLE public.tasks ADD CONSTRAINT tasks_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL; -- ── public.notes ───────────────────────────────────────────────────────────── ALTER TABLE public.notes DROP CONSTRAINT notes_created_by_fkey; ALTER TABLE public.notes ALTER COLUMN created_by DROP NOT NULL; ALTER TABLE public.notes ADD CONSTRAINT notes_created_by_fkey FOREIGN KEY (created_by) REFERENCES public.users(id) ON DELETE SET NULL; ALTER TABLE public.notes DROP CONSTRAINT notes_updated_by_fkey; ALTER TABLE public.notes ALTER COLUMN updated_by DROP NOT NULL; ALTER TABLE public.notes ADD CONSTRAINT notes_updated_by_fkey FOREIGN KEY (updated_by) REFERENCES public.users(id) ON DELETE SET NULL;