teecup/089_tournament_round_group_rls.sql
Erol Haagenrud 4587503d03 Flight/gruppe-scoping i ScoreTab (ADR-099) -- steg 1 av parity-planen
ScoreTab viste hele turneringsfeltet i stedet for brukerens egen
utslagsgruppe. Defaulter nå til egen flight med "vis hele feltet"-
veksling og fallback når gruppe mangler. is_self beregnes server-side
(aldri rå user_id). Lukker et reelt RLS-hull på tournament_round_group
funnet underveis (migrasjon 089).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 21:46:38 +02:00

27 lines
1.5 KiB
SQL

-- =====================================================================
-- TeeCup — migrasjon 089
-- RLS på tournament_round_group (lukker et hull fra migrasjon 084)
-- =====================================================================
-- Oppdaget under kartlegging til parity-arbeidet (score-føring i
-- turnering vs. frittstående runde, 2026-08-21): tournament_round_group
-- (opprettet i 084_tournament_round_groups.sql, utvidet i
-- 088_shotgun_start.sql) fikk ALDRI standard org_isolation-RLS-policyen
-- som ellers gjelder alle domenetabeller (ADR-003) -- i strid med
-- arkitektur-invarianten i CLAUDE.md. Ingen begrunnet unntak (i
-- motsetning til f.eks. round_shot/round_hole/round_message, som
-- bevisst står utenfor RLS per ADR-033 Beslutning A). I praksis kun
-- beskyttet av WHERE-ledd i applikasjonskoden frem til nå.
--
-- Ingen dataendring, kun policy -- alle eksisterende spørringer går
-- allerede via org_connection() (setter app.current_org), så dette er
-- additivt, ikke en atferdsendring for korrekt scopet kode.
-- =====================================================================
\set ON_ERROR_STOP on
ALTER TABLE tournament_round_group ENABLE ROW LEVEL SECURITY;
ALTER TABLE tournament_round_group FORCE ROW LEVEL SECURITY;
CREATE POLICY org_isolation ON tournament_round_group
USING (organization_id = current_setting('app.current_org', true)::uuid)
WITH CHECK (organization_id = current_setting('app.current_org', true)::uuid);