Hva som skjer: Kjør migrasjon 053_tournament_classes.sql mot ekte teecup_db — ny tournament_class-tabell + nullable class_id-kolonne på team_roster og tournament_participant (rent additivt, ingen eksisterende data røres). docker compose up -d --build teecup_api teecup_frontend — begge containere bygges og redeployes. Hva som er verifisert: Klasser kan opprettes/slettes for begge turneringstyper, med valgfritt standardutslag (kaskaderende bane→utslag-valg) I lagturneringer: klasse foreslår riktig utslag automatisk når en spiller legges til en kamp (bekreftet: Kari→44, Ola→56), ingen endring i selve kampresultatet I individuelle turneringer: samme utslag-forslag ved runde-oppsett, PLUSS leaderboardet deler seg nå i egne seksjoner per klasse med riktig rangering innad i hver (bekreftet: Damer viste Kari #1/Siv #2, Herrer viste Ola #1 — matcher håndregnet slagsum) Sletter man en klasse, mister spillerne bare merkelappen (ikke fjernet fra laget/turneringen) Ingen klasser opprettet = identisk visning som før (bakoverkompatibelt) 98/98 enhetstester og 12/12 isolasjonstester uendret, ekte typesjekket produksjonsbuild
41 lines
2.3 KiB
SQL
41 lines
2.3 KiB
SQL
-- Konkurranseklasser (2026-08-03) -- organisator kan opprette fritt navngitte
|
|
-- klasser (f.eks. "Damer", "Herrer A", "Junior") med et valgfritt
|
|
-- standardutslag, og knytte deltakere til en klasse. Delt mellom begge
|
|
-- turneringstyper (samme `tournament`-tabell, ADR-037s format_type-mønster)
|
|
-- -- én tabell dekker begge, i stedet for to duplikat-tabeller.
|
|
--
|
|
-- Brukt til (bekreftet med bruker FØR bygging):
|
|
-- 1. Forhåndsutfylle riktig utslag når en spiller legges til en match/runde
|
|
-- (BÅDE lagturneringer og individuelle turneringer) -- ren frontend-
|
|
-- bekvemmelighet, tee_id forblir required og eksplisitt i API-kontrakten.
|
|
-- 2. Egen resultatliste per klasse -- KUN i individuelle turneringer
|
|
-- (ADR-037, flatt felt). I lagturneringer (ADR-011, to lag) er poeng
|
|
-- knyttet til hele kamper, ikke enkeltspillere -- klasse er der bevisst
|
|
-- KUN et utslag-forslag, ingen egen leaderboard-splitting.
|
|
CREATE TABLE tournament_class (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
organization_id uuid NOT NULL,
|
|
tournament_id uuid NOT NULL,
|
|
name text NOT NULL,
|
|
default_tee_id uuid,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
FOREIGN KEY (organization_id, tournament_id) REFERENCES tournament (organization_id, id) ON DELETE CASCADE,
|
|
FOREIGN KEY (default_tee_id) REFERENCES tee (id) ON DELETE RESTRICT,
|
|
UNIQUE (tournament_id, name)
|
|
);
|
|
CREATE INDEX ON tournament_class (organization_id, tournament_id);
|
|
|
|
-- Nullable -- en klasse er valgfri, og sletter man en klasse skal ikke
|
|
-- roster-/deltaker-radene forsvinne (samme SET NULL-prinsipp som
|
|
-- tournament_round_bbb_hole, migrasjon 044).
|
|
ALTER TABLE team_roster
|
|
ADD COLUMN class_id uuid REFERENCES tournament_class (id) ON DELETE SET NULL;
|
|
ALTER TABLE tournament_participant
|
|
ADD COLUMN class_id uuid REFERENCES tournament_class (id) ON DELETE SET NULL;
|
|
|
|
-- Row-Level Security (samme org_isolation-policy-mønster som migrasjon 040).
|
|
ALTER TABLE tournament_class ENABLE ROW LEVEL SECURITY;
|
|
ALTER TABLE tournament_class FORCE ROW LEVEL SECURITY;
|
|
CREATE POLICY org_isolation ON tournament_class
|
|
USING (organization_id = current_setting('app.current_org', true)::uuid)
|
|
WITH CHECK (organization_id = current_setting('app.current_org', true)::uuid);
|