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