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>
66 lines
3.6 KiB
SQL
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;
|