-- ===================================================================== -- TeeCup — kontosammenslåing, "Del 2" av flere-e-postadresser (migrasjon 077) -- ===================================================================== -- Oppfølging av ADR-032/migrasjon 017 (sekundær e-post) -- "Del 1" dekket -- KUN det enkle tilfellet (fri, ukrevd adresse). Del 2: hva skjer når -- adressen som legges til ALLEREDE er en annen, eksisterende kontos -- primær- eller sekundæradresse -- samme reelle person har endt opp med -- to separate TeeCup-kontoer. Selvbetjent (bruker bekreftet eksplisitt). -- -- Samme token-hash-og-utløp-mønster som magic_link_token (004) -> -- email_change_token (016) -> secondary_email_token (017): bevis -- eierskap av MÅL-kontoens e-post FØR selve sammenslåingen utføres. -- Lenken sendes til MÅL-kontoens (taperens) e-post -- beviser eierskap av -- DEN kontoen, ikke bare at initiativtakeren (keeperen) fortsatt er -- innlogget, samme prinsipp som ADR-032 Beslutning B. -- -- `initiator_user_id`/`target_user_id` er BEVISST asymmetriske roller, -- ikke to likeverdige parter: initiator (keeper) er den som ber om -- sammenslåingen fra en aktiv økt, target (taper) er kontoen som slås -- INN i keeperen og til slutt slettes (se app/account_merge.py -- ingen -- sesjons-tilbakekallingsmekanisme finnes i denne appen, sletting av -- app_user-raden er eneste måte å tvinge ut en gjenlevende -- øktinformasjonskapsel for taper-kontoen). -- ===================================================================== \set ON_ERROR_STOP on CREATE TABLE account_merge_token ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), initiator_user_id uuid NOT NULL REFERENCES app_user(id) ON DELETE CASCADE, target_user_id uuid NOT NULL REFERENCES app_user(id) ON DELETE CASCADE, token_hash text NOT NULL UNIQUE, expires_at timestamptz NOT NULL, consumed_at timestamptz, created_at timestamptz NOT NULL DEFAULT now(), CHECK (initiator_user_id <> target_user_id) ); CREATE INDEX ON account_merge_token (initiator_user_id); CREATE INDEX ON account_merge_token (target_user_id); GRANT SELECT, INSERT, UPDATE ON account_merge_token TO teecup_app;