teecup/069_flag_plant.sql

67 lines
3.6 KiB
MySQL
Raw Permalink Normal View History

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