-- =====================================================================
--  TeeCup — migrasjon 005
--  RLS-fiks: tomstreng i app.current_org (se FEATURE_BACKLOG.md)
-- =====================================================================
--  Kjøres etter 001-004.
--
--  BUG: current_setting('app.current_org', true)::uuid håndterer NULL trygt
--  (gir ingen rader, som skjemaets kommentar i 001 lover: "trygg standard"),
--  men IKKE tomstreng. En gjenbrukt asyncpg-pool-tilkobling der en TIDLIGERE
--  forespørsel satte GUC-en via SET LOCAL (org_connection(), app/db.py) kan
--  lese den tilbake som '' etter at den transaksjonen er ferdig — en custom
--  GUC sin nullstilte tilstand er tomstreng når placeholderen først er
--  opprettet i sesjonen, ikke fullstendig fraværende. ''::uuid kaster en
--  feil (500) i stedet for trygt null rader. Oppdaget da /auth/me (egen
--  runde) spurte `organization` via plain_connection() (ingen org-kontekst).
--
--  FIKS: NULLIF(current_setting(...), '')::uuid — konverterer tomstreng til
--  NULL FØR cast. Samlet i én STABLE SQL-funksjon fremfor duplisert i 15
--  policyer.
-- =====================================================================

\set ON_ERROR_STOP on

-- Feil raskt fremfor å blokkere hele appen hvis en ALTER POLICY skulle køe
-- bak en lang spørring — hver ALTER POLICY under tar ACCESS EXCLUSIVE på
-- måltabellen til COMMIT.
SET lock_timeout = '5s';

CREATE OR REPLACE FUNCTION app_current_org() RETURNS uuid
LANGUAGE sql STABLE AS $$
    SELECT NULLIF(current_setting('app.current_org', true), '')::uuid
$$;

-- De 14 org_isolation-tabellene: 12 fra 001 + 2 fra 003 (samme array som
-- CREATE-loopene der — hold denne i sync hvis en fremtidig migrasjon
-- legger til en ny org-scopet tabell).
DO $$
DECLARE t text;
BEGIN
    FOREACH t IN ARRAY ARRAY[
        'player','course','hole','tee','tee_rating',
        'tournament','team','team_roster','session',
        'match','match_participant','hole_score',
        'match_hole_result','lineup_lock'
    ]
    LOOP
        EXECUTE format($p$
            ALTER POLICY org_isolation ON %I
                USING       (organization_id = app_current_org())
                WITH CHECK  (organization_id = app_current_org());
        $p$, t);
    END LOOP;
END $$;

-- org_self ble opprinnelig laget UTEN eksplisitt WITH CHECK (polwithcheck er
-- NULL i pg_policy, ikke en snapshot av USING) — Postgres sin
-- speiler-USING-når-WITH-CHECK-mangler-fallback er dynamisk, ikke en
-- engangskopi tatt ved CREATE. Å re-issue kun USING her er derfor korrekt.
ALTER POLICY org_self ON organization
    USING (id = app_current_org());
