Aggiunge il dettaglio esteso di partita: formazioni e scontri diretti dal CSI

In Campionato > Storico partite ogni gara diventa cliccabile: verso /partita/$id
se collegata a un evento CrAPP, verso la nuova /partita-csi/$id altrimenti (nessuna
creazione automatica di eventi dal calendario CSI, quindi molte gare ne sono prive).

Il dettaglio aggiunge formazioni (titolari/panchina/staff), storico scontri diretti
e probabilità di vittoria calcolata dal CSI, letti on-demand da tre nuovi endpoint
per-partita (match-main/players/stats.php) dietro /api/public/csi-partita/$id, con
cache server per-partita separata da quella di /api/public/csi — è un dato aperto a
richiesta, non precaricato per tutti come classifica e partite.

Include anche logo squadra e metadati leggeri (girone, n° gara, arbitro, link al
referto ufficiale) già presenti nel JSON esistente, a costo zero.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-09 12:07:03 +02:00
co-authored by Claude Sonnet 5
parent c628997934
commit 5569d08b59
12 changed files with 1207 additions and 38 deletions
+15 -1
View File
@@ -70,11 +70,25 @@ try {
const html = await pagina("/classifica");
assert.match(titolo(html), /Classifica campionato/);
assert.doesNotMatch(html, /CSI Milano/, "nessun residuo dei dati demo nel guscio");
// Una gara giocata deve avere un dettaglio "solo CSI" raggiungibile, con il suo
// endpoint per-partita servito (formazioni/precedenti): vedi partita-csi.$id.tsx.
const giocata = csi.partite.find((p) => p.setNostri !== null);
if (giocata) {
const htmlPartita = await pagina(`/partita-csi/${giocata.id}`);
assert.match(titolo(htmlPartita), /Dettaglio partita/);
const dettaglio = await fetch(url(`/api/public/csi-partita/${giocata.id}`));
assert.equal(dettaglio.status, 200, "l'endpoint per-partita risponde");
}
});
// --- 4. Dettaglio di un evento --------------------------------------------
await prova("le pagine di dettaglio reggono un id inesistente", async () => {
for (const percorso of ["/partita/non-esiste", "/allenamento/non-esiste"]) {
for (const percorso of [
"/partita/non-esiste",
"/allenamento/non-esiste",
"/partita-csi/non-esiste",
]) {
const res = await fetch(url(percorso));
assert.ok(res.status < 500, `${percorso}: nessun errore server (era ${res.status})`);
}