From 24af937fe0aca5bb06618fd9efb8ef702498f58d Mon Sep 17 00:00:00 2001 From: Erol Haagenrud Date: Sun, 19 Jul 2026 23:16:38 +0200 Subject: [PATCH] Update Todos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- ARCHITECTURE_DECISIONS.md | 6 +++--- CLAUDE.md | 44 +++++++++++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/ARCHITECTURE_DECISIONS.md b/ARCHITECTURE_DECISIONS.md index b4feded..ab0db4e 100644 --- a/ARCHITECTURE_DECISIONS.md +++ b/ARCHITECTURE_DECISIONS.md @@ -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 spørsmål» under) — trygt med dagens ene `teecup_api`-container. -**Status: ✅ BYGGET 2026-07-19.** Ingen migrasjon, ingen ny Caddy-rute -(gjenbruker `/ws/*`-ruten fra ADR-025 uendret). Se CLAUDE.md-status for -scratch-verifisering og utrulling. +**Status: ✅ BYGGET OG LIVE 2026-07-19.** Ingen migrasjon, ingen ny +Caddy-rute (gjenbruker `/ws/*`-ruten fra ADR-025 uendret). Se CLAUDE.md- +status for scratch-verifisering og utrulling. --- diff --git a/CLAUDE.md b/CLAUDE.md index fc12f3c..cd0b891 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1631,13 +1631,49 @@ Ferdig og verifisert: begge containere boot-et rent, `/health`/`dashboard` → 200, `teeoff.no` 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: 1. PWA-egenskaper (manifest, service worker, offline-cache) — ikke startet. 2. Fortsatt åpne beslutninger fra FEATURE_BACKLOG.md: kode-regenerering for - ADR-020, korrigering-godkjenning fra motpart, live-oppdatering av - `/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 + ADR-020, korrigering-godkjenning fra motpart, video/1-til-1-meldinger (bevisst utsatt i ADR-025). 3. Flere turneringsformater utover Ryder Cup (Københavner/High-low-high/ Robbins/Try all, notert 2026-07-19) — ingen ADR-runde startet ennå.