Rundeleaderboard: ny GET /rounds/{id}/leaderboard-backend er live (rangering, thru-tall, brutto+netto til par, håndterer 1 til 15+ deltakere). V0-prompten for selve visningen ligger i FEATURE_BACKLOG.md, klar til å limes inn i v0.app — send meg zip-en når du har den, så kobler jeg den på (foreslått rute /my-rounds/[id]/leaderboard, lenket fra rundesiden).
Begge deler scratch-verifisert (39/39 sjekker, inkl. en uavhengig kryssjekk av netto-beregningen mot handicap_engine direkte), rullet ut mot ekte teecup_db/containere, teeoff.no upåvirket.
23 lines
1.2 KiB
SQL
23 lines
1.2 KiB
SQL
-- In-app varslingssenter (FEATURE_BACKLOG.md "Varsler"-runden, 2026-07-25).
|
|
-- Eid av BRUKER (mottaker), ikke organisasjon -- INGEN RLS, samme
|
|
-- plain_connection()-mønster som personlig profil/HCP-historikk/venner
|
|
-- (ADR-033 Beslutning A / ADR-036 Beslutning A). `message` er en FERDIG
|
|
-- norsk tekst, snapshot-prinsipp (samme som author_display_name i
|
|
-- meldinger, ADR-025) -- unngår å måtte slå opp relaterte data på nytt ved
|
|
-- hver lesing, og overlever at den relaterte raden (f.eks. en venneforespørsel)
|
|
-- senere slettes.
|
|
|
|
CREATE TABLE notification (
|
|
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id uuid NOT NULL REFERENCES app_user(id) ON DELETE CASCADE,
|
|
type text NOT NULL CHECK (type IN ('friend', 'tournament', 'round', 'result')),
|
|
message text NOT NULL,
|
|
link_path text NOT NULL,
|
|
created_at timestamptz NOT NULL DEFAULT now(),
|
|
read_at timestamptz
|
|
);
|
|
|
|
CREATE INDEX notification_user_created_idx ON notification (user_id, created_at DESC);
|
|
CREATE INDEX notification_user_unread_idx ON notification (user_id) WHERE read_at IS NULL;
|
|
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON notification TO teecup_app;
|