teecup/008_link_player_by_email.sql

36 lines
1.5 KiB
MySQL
Raw Permalink Normal View History

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