teecup/032_round_visibility.sql
Erol Haagenrud 7631ef60e6 Bygget: ADR-036 fase 2 — rundevisibilitet, helt etter det allerede designede mønsteret (privat/offentlig/venner-i-valgt-kategori):
round.visibility_mode (privat som trygg standard) + ny tabell for hvilke venne-kategorier som får se en gitt runde.
Kjernesjekken (_can_view_round) viste seg å være en ren utvidelse av den eksisterende eier/medspiller-sjekken, så fire lese-endepunkter ble omstrukturert til delte funksjoner og gjenbrukt av sju nye offentlige endepunkter + et nytt offentlig sanntids-WS — i stedet for å bygge alt parallelt fra bunnen.
Ny vennprofil-side (/my-friends/[id]) — navn/avatar/HCP/hjemmeklubb + liste over personens synlige runder, "pågår nå" øverst.
Ny read-only live-visning (/watch/[id]) for tredjeparter — matchstatus, skins-tavle eller individuell rangering avhengig av spilleform.
Synlighetsvelger lagt til både i opprett-runde og rediger-runde.
Verifisert grundig: 191 automatiserte sjekker (inkl. full regresjon av to eksisterende testsuiter) + en fullstendig nettleser-gjennomgang med tre reelle brukere i separate innloggingskontekster — inkludert en helt anonym leser som beviste at "offentlig" faktisk betyr offentlig, og en reell venn/kategori-negativ-kontroll som beviste at feil kategori korrekt nekter tilgang.

Migrasjon kjørt mot ekte database (kun additiv), begge containere rullet ut, teeoff.no upåvirket.
2026-07-28 19:25:37 +02:00

39 lines
1.9 KiB
SQL

-- =====================================================================
-- TeeCup — rundevisibilitet for frittstående runder (migrasjon 032,
-- ADR-036 fase 2)
-- =====================================================================
-- round.visibility_mode ('public'/'private'/'friends', default 'private'
-- -- trygg standard, samme filosofi som RLS-policyenes "se ingenting" ved
-- manglende kontekst). Ved 'friends' velges EKSPLISITT hvilke av eierens
-- private kategorier (samme faste sett som friend_categorization,
-- migrasjon 025) som får se runden -- ikke "alle venner".
--
-- Styrer KUN tredjeparts innsyn (venner/offentligheten) -- en faktisk
-- lagt-til medspiller (round_participant.user_id) ser alltid runden
-- uansett visibility_mode, uendret av denne migrasjonen.
--
-- Ingen RLS, samme `plain_connection()`-mønster som resten av
-- runde-/venne-tabellene (ADR-033 Beslutning A) -- autorisasjon
-- håndheves i app-laget.
-- =====================================================================
\set ON_ERROR_STOP on
ALTER TABLE round ADD COLUMN visibility_mode text NOT NULL DEFAULT 'private'
CHECK (visibility_mode IN ('public', 'private', 'friends'));
CREATE TABLE round_visible_category (
round_id uuid NOT NULL REFERENCES round(id) ON DELETE CASCADE,
-- Samme faste kategori-sett som friend_categorization (migrasjon 025)
-- -- bevisst duplisert CHECK fremfor en delt ENUM-type, samme
-- pragmatiske mønster som resten av skjemaet (BAG_CLUBS/gender/
-- stat_level m.fl. er alle CHECK-baserte, ikke ENUM).
category text NOT NULL CHECK (category IN (
'spouse', 'close_family', 'extended_family', 'close_friends',
'golf_friends', 'colleagues', 'business', 'classmates',
'acquaintances', 'other'
)),
PRIMARY KEY (round_id, category)
);
GRANT SELECT, INSERT, UPDATE, DELETE ON round_visible_category TO teecup_app;