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.
35 lines
1.5 KiB
PL/PgSQL
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;
|