teecup/026_notifications.sql
Erol Haagenrud 9987c93e18 Varsler (fra zip 20): in-app varslingssenter er live — bjelle med uleste-tall i dashbord-headeren, /my-notifications-side. Trigges i dag ved venneforespørsel sendt/akseptert; flere hendelser kan kobles på senere.
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.
2026-07-26 06:53:58 +02:00

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;