Introduce architettura multi-sport con catalogo, engine scoring e overlay.

Catalogo sport in YAML, board implicito, engine per volley/basket/timed/racket/timer/generic, regia e app Android allineate.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-09 20:11:21 +02:00
parent 53f9a6a884
commit e727069d43
56 changed files with 1783 additions and 223 deletions

49
docs/MULTI_SPORT.md Normal file
View File

@@ -0,0 +1,49 @@
# Multi-sport — Match Live TV
## Concetti
| Concetto | Descrizione |
|----------|-------------|
| `sport_key` | Disciplina (pallavolo, basket, tennis…) — sulla squadra e snapshot sulla partita |
| `board_type` | Macro-tabellone **implicito** dal catalogo (`volley`, `basket`, `timed`, `racket`, `timer`, `generic`) |
| `overlay_kind` | Layout video sulla partita (`none`, `timer`, `volley`, `basket`, `timed`, `racket`) |
| `scoring_rules` | Regole effettive della partita (override sui default del catalogo) |
## Catalogo
Definito in [`backend/config/sports.yml`](../backend/config/sports.yml), caricato da `Sports::Catalog`.
- Nessuna tabella `sports` in DB
- API: `GET /api/v1/sports`
## Scoring
`Scoring::Engine.for(match)` seleziona l'engine:
| Board | Engine | Azioni principali |
|-------|--------|-------------------|
| volley | VolleyEngine | +1, 1, chiudi set |
| racket | RacketEngine | come volley (fase 1) |
| generic | GenericEngine | +1, 1 (nessuna chiusura set) |
| basket | BasketEngine | +1/+2/+3, quarti, cronometro |
| timed | TimedEngine | +1, 1, tempi, cronometro |
| timer | TimerEngine | solo cronometro |
`score_states.data` (JSONB) per basket/timed/timer.
## Overlay
Scelto per partita (`overlay_kind`), limitato da `allowed_overlays` dello sport.
Rendering Android: `OverlayKind` in `OverlayState``ScoreboardElement`, `CompactScoreboardElement`, `TimerElement`.
## Migrazione
- `teams.sport``sport_key` (`volleyball``pallavolo`)
- `matches.sport``sport_key`
- `matches.overlay_kind` (nullable)
- `score_states.board_type`, `score_states.data`
## Regia web
Partial per board in `app/views/public/regia/_*.html.erb`, `data-board` su `#regia-app`.