-- ===================================================================== -- TeeCup — sekundær, verifisert e-postadresse per konto (migrasjon 017) -- ===================================================================== -- Oppfølging av ADR-032 (verifisert e-postbytte), reist av brukeren rett -- etterpå: én person kan ha flere e-postadresser i omløp samtidig (privat -- vs. jobb-adresse en organisator har lagt inn en spiller/invitasjon på). -- Dette dekker BEVISST kun det enkle tilfellet -- en FRI, ukrevd adresse -- legges til og verifiseres. Ekte konto-SAMMENSLÅING (adressen tilhører -- allerede en annen, eksisterende konto) er en egen, større, separat sak -- (se FEATURE_BACKLOG.md "Én person, flere e-postadresser") og håndheves -- IKKE her -- unikheten under garanterer at en adresse aldri kan stå som -- sekundær på to kontoer samtidig (samme rad ville krevd en eksplisitt -- sammenslåingsbeslutning som ikke finnes ennå). -- -- To tabeller, samme token-hash-og-utløp-mønster som email_change_token -- (016): en midlertidig verifiseringstoken (bevis eierskap FØR raden -- faktisk opprettes -- unngår en "krevd men aldri bekreftet"-adresse som -- likevel opptar en unik plass), og selve den verifiserte adressen. -- ===================================================================== \set ON_ERROR_STOP on CREATE TABLE secondary_email_token ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), user_id uuid NOT NULL REFERENCES app_user(id) ON DELETE CASCADE, email citext NOT NULL, token_hash text NOT NULL UNIQUE, expires_at timestamptz NOT NULL, consumed_at timestamptz, created_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX ON secondary_email_token (user_id); CREATE TABLE user_secondary_email ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), user_id uuid NOT NULL REFERENCES app_user(id) ON DELETE CASCADE, -- Globalt unik -- kan aldri stå som sekundær på to kontoer samtidig, -- og aldri samtidig være en ANNEN kontos primære e-post (håndhevet i -- app-laget ved innsetting, se app/routers/auth.py -- en ren DB-CHECK -- på tvers av to tabeller er ikke mulig i Postgres). email citext NOT NULL UNIQUE, created_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX ON user_secondary_email (user_id); GRANT SELECT, INSERT, UPDATE, DELETE ON secondary_email_token TO teecup_app; GRANT SELECT, INSERT, DELETE ON user_secondary_email TO teecup_app;