50 lines
2.5 KiB
MySQL
50 lines
2.5 KiB
MySQL
|
|
-- =====================================================================
|
||
|
|
-- 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;
|