teecup/069_flag_plant.sql
Erol Haagenrud 25bdabe3ea Flaggturnering: GPS-flaggplanting (Del A) + kartoversikt (Del B)
Del A (ADR-066, migrasjon 069/070, allerede rullet ut mot teecup_db):
"Plant flagget" via GPS, med en interaktiv "Hullet du ut?"-bekreftelse
før posisjonen registreres, pluss full runde 2+-scoreføring for
spillere som fullfører 18 hull med slag igjen. Ny, isolert overflow-
tabell (rører ikke delt round_hole/tournament_round_hole). Bygget for
både frittstående runder og org-individuelle turneringer. UI-sheeten
er en Claude-skrevet V0-eksport (zip 11).

Del B (ADR-067, migrasjon 071, klar for utrulling): av/på-bryter
(standard AV) for en satellittkartoversikt over ALLE deltakeres
plantede flagg, lap 1 skilt fra lap 2+ med farge+tekstbadge. Frittstående
runder får full tilskuerstøtte (/watch/[id]); org-individuelle
turneringer er bevisst avgrenset til medlemmer/deltakere, siden ingen
offentlig spectator-side finnes for det turneringsformatet ennå.

Se ARCHITECTURE_DECISIONS.md (ADR-066/067) og CHANGELOG.md (punkt 82/83)
for full begrunnelse og verifiseringslogg.

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

66 lines
3.6 KiB
SQL

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