-- ===================================================================== -- TeeCup — Flaggturnering: GPS-flaggplanting + runde 2+ (migrasjon 069, -- frittstående runder). Se ARCHITECTURE_DECISIONS.md for ADR-tillegget. -- -- To nye, uavhengige tabeller: -- -- 1. round_participant_flag_plant -- posisjonen der spilleren gikk tom -- for slag. ETT aktivt flagg per deltaker (UNIQUE på round_ -- participant_id) -- re-planting er slett+opprett-på-nytt, samme -- "aldri en delvis UPDATE"-prinsipp som round_shot (migrasjon 060). -- `lap`/`hole_number` er hvilket hull/runde-nummer flagget faktisk -- tilhører (beregnet server-side fra registrert scoredata, aldri -- stolt blindt på fra klienten -- se app/routers/rounds.py). -- -- 2. round_hole_flag_overflow -- scoreføring for "runde 2+" (spilleren -- fullførte 18 hull MED slag igjen, fortsetter play_order på nytt). -- BEVISST en helt egen tabell, IKKE en lap-kolonne på selve -- round_hole -- den tabellen er delt av samtlige ni eksisterende -- spilleformater og lest av et stort antall eksisterende spørringer -- (scorekort/statistikk/HCP-differensial) som alle antar ≤18 rader -- per deltaker. En isolert tabell holder ALL risiko for denne -- reelt sjeldne (krever uvanlig sjenerøst slagbudsjett) funksjonen -- innenfor selve flagg-funksjonen, uten å røre noe annet format. -- -- Eierskap/tilgang: samme non-RLS plain_connection() + app-lag- -- autorisasjon som resten av frittstående-rundesystemet (ADR-033 -- Beslutning A) -- speiler round_shot presist. -- ===================================================================== \set ON_ERROR_STOP on CREATE TABLE round_participant_flag_plant ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), round_participant_id uuid NOT NULL UNIQUE REFERENCES round_participant(id) ON DELETE CASCADE, lap smallint NOT NULL DEFAULT 1 CHECK (lap >= 1), hole_number smallint NOT NULL CHECK (hole_number BETWEEN 1 AND 18), lat double precision NOT NULL CHECK (lat BETWEEN -90 AND 90), lng double precision NOT NULL CHECK (lng BETWEEN -180 AND 180), -- Landet flagget PÅ selve greenen -- avstand til hullet (cm-presisjon, -- meter+cm slås sammen til én cm-verdi her, splittes kun i UI-et) -- brukes til å rangere spillere som gikk tom på SAMME hull mot -- hverandre (jo nærmere koppen, jo lengre har spilleren kommet). on_green boolean NOT NULL DEFAULT false, distance_to_pin_cm integer CHECK (distance_to_pin_cm >= 0), CHECK (on_green OR distance_to_pin_cm IS NULL), planted_by_user_id uuid NOT NULL REFERENCES app_user(id), planted_at timestamptz NOT NULL DEFAULT now() ); CREATE TABLE round_hole_flag_overflow ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), round_participant_id uuid NOT NULL REFERENCES round_participant(id) ON DELETE CASCADE, lap smallint NOT NULL CHECK (lap >= 2), hole_number smallint NOT NULL CHECK (hole_number BETWEEN 1 AND 18), score smallint CHECK (score > 0), played boolean NOT NULL DEFAULT false, UNIQUE (round_participant_id, lap, hole_number) ); CREATE INDEX round_hole_flag_overflow_participant_idx ON round_hole_flag_overflow (round_participant_id); -- INGEN RLS -- samme plain_connection()-mønster som round_shot/round_hole. GRANT SELECT, INSERT, DELETE ON round_participant_flag_plant TO teecup_app; GRANT SELECT, INSERT, UPDATE, DELETE ON round_hole_flag_overflow TO teecup_app;