teecup/008_link_player_by_email.sql
Erol Haagenrud bb3b19560c Migrasjon 008 er live på ekte teecup_db, backend er redeployet, alt verifisert (teeoff.no upåvirket gjennom hele prosessen).
ADR-017 sin backend er nå komplett: registrerings-API-et og kontosammenkoblingen fungerer sammen — en spiller organisator la inn på forhånd, i én eller flere klubber, kobles automatisk til riktig konto første gang hen logger inn, uten å bli medlem av noe hun ikke ba om.
2026-07-18 09:03:37 +02:00

35 lines
1.5 KiB
PL/PgSQL

-- =====================================================================
-- TeeCup — migrasjon 008
-- E-post-basert kontosammenkobling ved innlogging (ADR-017 Beslutning B)
-- =====================================================================
-- Kjøres etter 001-007.
--
-- Kontekst: en spiller kan ha `player`-rader (organisator-opprettet eller
-- selvregistrert) i FLERE organisasjoner, uten å være MEDLEM av noen av
-- dem. Ved innlogging (magic-link -- e-postkontroll er allerede bevist)
-- skal enhver `player`-rad med matchende e-post og `user_id IS NULL`
-- kobles til den nå innloggede kontoen, uansett hvilken org den tilhører.
--
-- Samme "løs kontekst-problemet FØR RLS kan håndheve noe"-mønster som
-- `public_tournament_org()` (migrasjon 007): en vanlig org-scopet
-- UPDATE via org_connection() kan ikke krysse organisasjonsgrenser --
-- brukeren er jo nettopp IKKE nødvendigvis medlem av noen av dem.
-- SECURITY DEFINER kjører derfor med skaperens BYPASSRLS-rettigheter,
-- akkurat som i 007. `SET search_path = public` hindrer search_path-
-- kapring (samme herding).
-- =====================================================================
\set ON_ERROR_STOP on
CREATE FUNCTION link_player_by_email(p_user_id uuid, p_email text)
RETURNS void
LANGUAGE sql
SECURITY DEFINER
SET search_path = public
AS $$
UPDATE player
SET user_id = p_user_id
WHERE user_id IS NULL AND lower(email) = lower(p_email);
$$;
GRANT EXECUTE ON FUNCTION link_player_by_email(uuid, text) TO teecup_app;