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.
39 lines
1.9 KiB
SQL
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;
|