Sposta roster, eventi, presenze, voti, scout e palloni su PocketBase
Riscrive i moduli dati che parlavano con Supabase per usare l'SDK
PocketBase, mantenendo invariate le firme degli hook React Query così i
componenti a valle non cambiano: giocatori-squadra, eventi, presenze,
cacche, pagelle, mvp-voti, badge-social, scout (store/live/stato),
palloni.
Aggiunge due helper condivisi in src/integrations/pocketbase/:
- upsert.ts: PocketBase non ha upsert nativo, questi replicano il
pattern onConflict di Supabase (per id significativo o per filtro su
combinazione di campi), verificati contro un'istanza reale così da non
duplicare record sulla stessa scrittura ripetuta;
- formato.ts: normalizza le date PocketBase ("AAAA-MM-GG HH:MM:SS.sssZ",
spazio non "T") a ISO stretto, altrimenti Date.parse e i confronti
testuali con altre date si comportano in modo incoerente.
Corregge anche due problemi trovati testando contro un'istanza reale:
- alcune API rule confrontavano un campo relazione con @request.auth.id
senza richiedere l'autenticazione, lasciando passare richieste anonime
quando entrambi i lati erano vuoti;
- gli hook non riconoscevano il superuser PocketBase (solo il ruolo
admin applicativo), bloccando le operazioni fatte con pbAdmin.
Aggiunta la colonna "casa" mancante su eventi_app e i campi di sistema
created/updated (non generati automaticamente da PocketBase per le
collection create via migration, a differenza di quanto assunto
inizialmente).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+10
-14
@@ -23,10 +23,10 @@ const riga: RigaEvento = {
|
||||
campionato: true,
|
||||
casa: true,
|
||||
pagelle_chiuse: false,
|
||||
creato_il: "2026-08-20T09:00:00Z",
|
||||
created: "2026-08-20 09:00:00.000Z",
|
||||
};
|
||||
|
||||
// --- daRiga: i NULL del database diventano valori sicuri ---------------------
|
||||
// --- daRiga: normalizza data/creato_il, PocketBase non ha NULL (solo "", [], false) -----
|
||||
assert.deepEqual(daRiga(riga), {
|
||||
id: "e1",
|
||||
tipo: "partita",
|
||||
@@ -39,20 +39,20 @@ assert.deepEqual(daRiga(riga), {
|
||||
campionato: true,
|
||||
casa: true,
|
||||
pagelleChiuse: false,
|
||||
creatoIl: "2026-08-20T09:00:00Z",
|
||||
creatoIl: "2026-08-20T09:00:00.000Z",
|
||||
});
|
||||
|
||||
const vuota = daRiga({
|
||||
...riga,
|
||||
note: null,
|
||||
convocati: null,
|
||||
casa: null,
|
||||
note: "",
|
||||
convocati: [],
|
||||
casa: false,
|
||||
campionato: false,
|
||||
pagelle_chiuse: false,
|
||||
});
|
||||
assert.equal(vuota.note, "", "note NULL → stringa vuota");
|
||||
assert.deepEqual(vuota.convocati, [], "convocati NULL → tutta la rosa (array vuoto)");
|
||||
assert.equal(vuota.casa, true, "casa NULL → si gioca in casa");
|
||||
assert.equal(vuota.note, "", "note vuota resta vuota");
|
||||
assert.deepEqual(vuota.convocati, [], "convocati vuoti → tutta la rosa (array vuoto)");
|
||||
assert.equal(vuota.casa, false, "casa è quello che c'è in database, nessun default implicito");
|
||||
assert.equal(vuota.pagelleChiuse, false);
|
||||
|
||||
// --- categoriaEvento: l'amichevole è una partita fuori campionato ------------
|
||||
@@ -100,11 +100,7 @@ assert.deepEqual(
|
||||
["g2"],
|
||||
"con i convocati indicati si filtra",
|
||||
);
|
||||
assert.deepEqual(
|
||||
convocatiEvento(daRiga({ ...riga, convocati: null }), rosa),
|
||||
rosa,
|
||||
"vuoto = tutti",
|
||||
);
|
||||
assert.deepEqual(convocatiEvento(daRiga({ ...riga, convocati: [] }), rosa), rosa, "vuoto = tutti");
|
||||
assert.deepEqual(convocatiEvento(null, rosa), rosa, "senza evento restano tutti");
|
||||
assert.deepEqual(
|
||||
convocatiEvento(daRiga({ ...riga, convocati: ["ignoto"] }), rosa),
|
||||
|
||||
Reference in New Issue
Block a user