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