teecup/077_account_merge.sql

43 lines
2.2 KiB
MySQL
Raw Permalink Normal View History

-- =====================================================================
-- 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;