Update Todos

Opprette app/realtime.py (delt WS-register, ingen router-avhengigheter)

Koble broadcast inn i recompute_and_cache_match_state + apply_concession

Legge til WS-endepunkt /ws/public/tournaments/{id}/live i messaging.py

Frontend: koble public-live.tsx til WebSocket med auto-refetch

Scratch-verifisere (REST + WebSocket)

Ekte typesjekket frontend-build

Skrive ADR-027 + oppdatere FEATURE_BACKLOG.md

Deploy etter bekreftelse + CLAUDE.md-statuslogg
"Følg live"-siden er nå faktisk live. Ny scores/walkover trigger en kringkasting over WebSocket til alle som følger den turneringen — siden henter automatisk leaderboardet på nytt, og matcher/scorekort som er åpne akkurat da, uten at noen trenger å laste siden på nytt.

Gjenbrukte hele infrastrukturen fra meldings-runden (samme /ws/*-Caddy-rute, ingen ny driftsendring), men måtte legge kringkastingsregisteret i en egen, rutefri modul (app/realtime.py) for å unngå en sirkulær import mellom filene. Verifisert med faktisk sanntidsmottak i scratch (ikke bare REST-svar) og et ekte wss://-håndtrykk mot produksjon.

.md-filene er oppdatert.
This commit is contained in:
Erol Haagenrud 2026-07-19 23:16:38 +02:00
parent 09aaa38bde
commit 24af937fe0
2 changed files with 43 additions and 7 deletions

View file

@ -1194,9 +1194,9 @@ sentrale funksjoner i prosjektet. `apply_concession` fikk en ny påkrevd
**Samme kjente in-memory-per-prosess-begrensning som ADR-025** (se «Åpne **Samme kjente in-memory-per-prosess-begrensning som ADR-025** (se «Åpne
spørsmål» under) — trygt med dagens ene `teecup_api`-container. spørsmål» under) — trygt med dagens ene `teecup_api`-container.
**Status: ✅ BYGGET 2026-07-19.** Ingen migrasjon, ingen ny Caddy-rute **Status: ✅ BYGGET OG LIVE 2026-07-19.** Ingen migrasjon, ingen ny
(gjenbruker `/ws/*`-ruten fra ADR-025 uendret). Se CLAUDE.md-status for Caddy-rute (gjenbruker `/ws/*`-ruten fra ADR-025 uendret). Se CLAUDE.md-
scratch-verifisering og utrulling. status for scratch-verifisering og utrulling.
--- ---

View file

@ -1631,13 +1631,49 @@ Ferdig og verifisert:
begge containere boot-et rent, `/health`/`dashboard` → 200, `teeoff.no` begge containere boot-et rent, `/health`/`dashboard` → 200, `teeoff.no`
upåvirket. upåvirket.
- **"Følg live"-siden koblet til sanntid (2026-07-19, ADR-027):** brukeren
fulgte anbefalingen fra forrige runde — `/t/[id]/live` (bygget i
tilskuer-runden samme dag) krevde omlasting for nye resultater.
**Bygget:** ny, RUTEFRI modul `app/realtime.py` (in-memory
tilkoblingsregister + `broadcast_live_update(tournament_id)`) -- ligger
bevisst BAK alle routere i importgrafen for å unngå en sirkulær import
(`registration.py` importerer allerede fra `scoring.py`/`tournaments.py`/
`matches.py`, og `messaging.py` importerer fra `registration.py`; en
kringkastingsfunksjon i noen av routerne ville derfor bitt seg selv i
halen). Kringkastingen er lagt INN I `recompute_and_cache_match_state` og
`apply_concession` selv (sistnevnte fikk en ny påkrevd `tournament_id`-
parameter) -- kallerne (hole-score/hole-result-innsending, walkover på
både match- og turnering-nivå) trenger ikke huske å gjøre noe selv. Nytt
WS-endepunkt `/ws/public/tournaments/{id}/live` i `messaging.py`
(gjenbruker `/ws/*`-Caddy-ruten fra ADR-025 uendret -- ingen ny
infrastruktur). Sender bevisst kun et "noe endret seg, hent på nytt"-
signal, ikke selve dataene -- unngår å duplisere leaderboardets
projeksjons-regnestykke/blind draw-filtrering i kringkastings-payloaden.
**Frontend:** `components/public-live.tsx` åpner en WebSocket ved
montering; hver melding teller opp en `refreshKey` som utløser refetch av
leaderboardet ALLTID, og av en økts matcher/et scorekort KUN hvis det
faktisk er utvidet/åpent på skjermen akkurat da (ingen unødvendige kall
for lukket innhold). Liten pulserende prikk lagt til ved siden av
"Følg live"-teksten som visuell bekreftelse.
**Verifisert i scratch:** anonym avvist på live-WS for en `org`-synlig
turnering (samme visibility-sjekk som REST), satt til `public`, deretter
bekreftet FAKTISK sanntidsmottak (ikke bare at REST-svaret så riktig ut)
for BÅDE et vanlig hull-resultat OG en walkover-konsesjon -- en åpen
WebSocket-tilkobling mottok kringkastings-signalet i begge tilfeller.
Leaderboard fortsatt korrekt lesbar over REST etterpå (regresjon). Ekte
typesjekket produksjonsbuild kjørt og bekreftet.
**Rullet ut live 2026-07-19**, bruker bekreftet eksplisitt: ingen
migrasjon, ingen ny Caddy-endring, `docker compose up -d --build
teecup_api teecup_frontend`, begge containere boot-et rent. Verifisert
grundig etterpå: `/health`/`dashboard` → 200, `teeoff.no` upåvirket, OG et
ekte `wss://`-håndtrykk mot den NYE `/live`-ruten over produksjons-https
(ukjent turnering-id, ingen ekte data berørt) ga korrekt 404 fra selve
applikasjonslaget.
Neste steg: Neste steg:
1. PWA-egenskaper (manifest, service worker, offline-cache) — ikke startet. 1. PWA-egenskaper (manifest, service worker, offline-cache) — ikke startet.
2. Fortsatt åpne beslutninger fra FEATURE_BACKLOG.md: kode-regenerering for 2. Fortsatt åpne beslutninger fra FEATURE_BACKLOG.md: kode-regenerering for
ADR-020, korrigering-godkjenning fra motpart, live-oppdatering av ADR-020, korrigering-godkjenning fra motpart, video/1-til-1-meldinger
`/t/[id]/live`/leaderboard via WebSockets (samme mekanisme som meldinger
finnes og kan gjenbrukes — i dag må siden lastes på nytt for nye
resultater, ikke koblet til sanntid ennå), video/1-til-1-meldinger
(bevisst utsatt i ADR-025). (bevisst utsatt i ADR-025).
3. Flere turneringsformater utover Ryder Cup (Københavner/High-low-high/ 3. Flere turneringsformater utover Ryder Cup (Københavner/High-low-high/
Robbins/Try all, notert 2026-07-19) — ingen ADR-runde startet ennå. Robbins/Try all, notert 2026-07-19) — ingen ADR-runde startet ennå.