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