teecup/070_flag_plant_individual_tournament.sql

65 lines
3.4 KiB
MySQL
Raw Normal View History

-- =====================================================================
-- TeeCup — Flaggturnering: GPS-flaggplanting + runde 2+, org-
-- individuelle turneringer (migrasjon 070). Speiler migrasjon 069
-- (frittstående runder) presist, samme begrunnelse for hvorfor
-- overflow-scoring er en egen tabell og ikke en lap-kolonne på
-- tournament_round_hole (delt av alle formater, mange eksisterende
-- spørringer antar ≤18 rader per deltaker).
--
-- Ulikt 069: disse tabellene ER org-scopet og RLS-beskyttet (samme
-- org_isolation-policy-mønster som resten av tournament_round-familien,
-- migrasjon 040).
-- =====================================================================
\set ON_ERROR_STOP on
CREATE TABLE tournament_round_participant_flag_plant (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id uuid NOT NULL,
tournament_round_participant_id uuid NOT NULL UNIQUE,
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),
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(),
FOREIGN KEY (organization_id, tournament_round_participant_id)
REFERENCES tournament_round_participant(organization_id, id) ON DELETE CASCADE
);
CREATE TABLE tournament_round_hole_flag_overflow (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id uuid NOT NULL,
tournament_round_participant_id uuid NOT NULL,
lap smallint NOT NULL CHECK (lap >= 2),
hole_number smallint NOT NULL CHECK (hole_number BETWEEN 1 AND 18),
gross_strokes smallint CHECK (gross_strokes BETWEEN 1 AND 20),
played boolean NOT NULL DEFAULT false,
FOREIGN KEY (organization_id, tournament_round_participant_id)
REFERENCES tournament_round_participant(organization_id, id) ON DELETE CASCADE,
UNIQUE (tournament_round_participant_id, lap, hole_number)
);
CREATE INDEX ON tournament_round_participant_flag_plant (organization_id, tournament_round_participant_id);
CREATE INDEX ON tournament_round_hole_flag_overflow (organization_id, tournament_round_participant_id);
DO $$
DECLARE t text;
BEGIN
FOREACH t IN ARRAY ARRAY[
'tournament_round_participant_flag_plant',
'tournament_round_hole_flag_overflow'
]
LOOP
EXECUTE format('ALTER TABLE %I ENABLE ROW LEVEL SECURITY;', t);
EXECUTE format('ALTER TABLE %I FORCE ROW LEVEL SECURITY;', t);
EXECUTE format($p$
CREATE POLICY org_isolation ON %I
USING (organization_id = current_setting('app.current_org', true)::uuid)
WITH CHECK (organization_id = current_setting('app.current_org', true)::uuid);
$p$, t);
END LOOP;
END $$;