Segnala in modo visibile se il portale CSI cambia formato
Le vittorie in campionato dipendono dal JSON delle partite (non dalla classifica HTML, come erroneamente documentato prima). Se quel formato cambia, il parsing fallisce in silenzio: nessun errore, nessuna notifica, le vittorie restano ferme a 0% finché qualcuno non se ne accorge per caso. Aggiunta partiteFormatoSospetto() in csi-core.ts: confronta gli eventi grezzi con il risultato del parsing per distinguere un vero "formato cambiato" da un legittimo "nessuna gara ancora in programma". La route logga l'errore server e il flag arriva fino a /classifica, dove sostituisce la riga "Dati CSI aggiornati alle..." con un badge discreto color warning - visibile a chi apre la pagina, senza notifiche invasive. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@ import {
|
||||
CSI_GIRONE,
|
||||
parseClassifica,
|
||||
partiteDaEventi,
|
||||
partiteFormatoSospetto,
|
||||
urlClassifica,
|
||||
urlPartite,
|
||||
type DatiCsi,
|
||||
@@ -29,11 +30,29 @@ async function scarica(url: string): Promise<string> {
|
||||
async function leggiCsi(): Promise<DatiCsi> {
|
||||
const [html, json] = await Promise.all([scarica(urlClassifica()), scarica(urlPartite())]);
|
||||
const classifica = parseClassifica(html);
|
||||
const partite = partiteDaEventi(JSON.parse(json));
|
||||
const eventiGrezzi = JSON.parse(json);
|
||||
const partite = partiteDaEventi(eventiGrezzi);
|
||||
if (classifica.length === 0 && partite.length === 0) {
|
||||
throw new Error("CSI: risposta senza classifica né partite");
|
||||
}
|
||||
return { classifica, partite, girone: CSI_GIRONE, aggiornato: new Date().toISOString() };
|
||||
// La classifica basta a evitare l'errore sopra, ma se solo le partite si rompono (formato di
|
||||
// getEventsByTeamId.php cambiato) la route tornerebbe comunque 200 senza che nessuno se ne
|
||||
// accorga: le vittorie degli obiettivi di squadra resterebbero ferme a 0% in silenzio. Oltre
|
||||
// al log server, il flag arriva fino a `/classifica` (badge discreto) perché qualcuno se ne
|
||||
// accorga anche senza guardare i log.
|
||||
const formatoSospetto = partiteFormatoSospetto(eventiGrezzi, partite);
|
||||
if (formatoSospetto) {
|
||||
console.error(
|
||||
"csi: il formato di getEventsByTeamId.php sembra cambiato, nessuna partita riconosciuta",
|
||||
);
|
||||
}
|
||||
return {
|
||||
classifica,
|
||||
partite,
|
||||
girone: CSI_GIRONE,
|
||||
aggiornato: new Date().toISOString(),
|
||||
formatoSospetto,
|
||||
};
|
||||
}
|
||||
|
||||
export const Route = createFileRoute("/api/public/csi")({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { useMemo } from "react";
|
||||
import { createFileRoute, Link } from "@tanstack/react-router";
|
||||
import { ChevronRight, RefreshCw } from "lucide-react";
|
||||
import { AlertTriangle, ChevronRight, RefreshCw } from "lucide-react";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { formatData } from "@/lib/crapp-data";
|
||||
import { PageHeader } from "@/components/crapp/ui-bits";
|
||||
@@ -85,11 +85,24 @@ function Classifica() {
|
||||
const contenutoClassifica = useMemo(
|
||||
() => (
|
||||
<>
|
||||
<div className="mb-3 flex items-center gap-2 rounded-2xl bg-secondary px-3 py-2 text-xs text-muted-foreground">
|
||||
<RefreshCw className="h-3.5 w-3.5 text-accent" />
|
||||
{csi
|
||||
? `Dati CSI aggiornati ${formatAggiornamento(csi.aggiornato)}`
|
||||
: "Dati CSI in arrivo"}
|
||||
<div
|
||||
className={cn(
|
||||
"mb-3 flex items-center gap-2 rounded-2xl px-3 py-2 text-xs",
|
||||
csi?.formatoSospetto
|
||||
? "bg-warning/15 text-warning"
|
||||
: "bg-secondary text-muted-foreground",
|
||||
)}
|
||||
>
|
||||
{csi?.formatoSospetto ? (
|
||||
<AlertTriangle className="h-3.5 w-3.5 shrink-0 text-warning" aria-hidden />
|
||||
) : (
|
||||
<RefreshCw className="h-3.5 w-3.5 shrink-0 text-accent" aria-hidden />
|
||||
)}
|
||||
{csi?.formatoSospetto
|
||||
? "Il portale CSI potrebbe aver cambiato formato: dati da verificare."
|
||||
: csi
|
||||
? `Dati CSI aggiornati ${formatAggiornamento(csi.aggiornato)}`
|
||||
: "Dati CSI in arrivo"}
|
||||
</div>
|
||||
<div className="overflow-hidden rounded-3xl bg-card shadow-card">
|
||||
<div className="grid grid-cols-[2rem_minmax(0,1fr)_2rem_2.5rem_2.5rem] gap-2 border-b border-border px-3 py-2 text-xs font-bold uppercase text-muted-foreground">
|
||||
|
||||
Reference in New Issue
Block a user