Aggiorna DESIGN_DECISIONS.md (DD-015 da "In valutazione" ad "Accettata", con le conseguenze reali: fallback nascita e crapp-data.ts come solo seed/fallback), DATABASE.md, ARCHITECTURE.md e PROJECT_STATE.md di conseguenza.
5.7 KiB
Project State
Ultimo aggiornamento: 03/09/2026
Stato generale
Fase corrente:
Backend migrato al nuovo Supabase proprietario. M1 completata. M2 e M3 scritte e da applicare.
Autenticazione Google, dashboard amministratore e Profilo Giocatore (lato giocatore e lato
admin) implementati su develop, da attivare in produzione seguendo i passaggi più sotto.
Foto profilo (M6) e Scout Live (M7) non dipendono più da localStorage: entrambi ora
sincronizzano tra dispositivi tramite Supabase.
Infrastruttura
- GitHub configurato con branch
mainedevelop - Cursor come ambiente di sviluppo
- Vercel configurato; Environment Variables aggiornate al nuovo Supabase (Preview e Production)
- Supabase proprietario attivo — Project Ref:
kfkcldwncxqaixetsjes - 12 migration locali applicate con successo al nuovo database
- Sviluppo locale verificato con il nuovo Supabase
- Preview Vercel di
developverificata con successo (presenza scritta surisposte_presenzeconfermata nel nuovo database) - Produzione (
main): non ancora verificata in questa fase
Backend
- Backend operativo: Supabase proprietario (
kfkcldwncxqaixetsjes) - Lovable Cloud: non più backend operativo di CrAPP
- Vecchio Project Ref
hetycilxgkdmccelwerq: deprecato, non utilizzare
Database
- Schema v1.0 + M1 applicati al nuovo Supabase
public.giocatori_squadra: 17 giocatori iniziali presenti; solo 2 hanno l'email registrata (email, migrationm5_email_giocatori_squadra, DD-018) — le altre 15 arriveranno con una migration futurapublic.giocatori_squadraè ora la source of truth della rosa letta dall'app (DD-015, 03/09/2026): «Aggiungi giocatore» e «Disattiva giocatore» della dashboard admin si riflettono su Squadra, Presenze, Pagelle, Badge e Scout.src/lib/crapp-data.tsresta solo come seed storico, fallback offline e sorgente della data di nascita (colonna non ancora presente sugiocatori_squadra)- Migration
m6_avatar_giocatori: bucket pubblicoavatar-giocatoriper le foto profilo, al posto dilocalStorage(una per giocatore, letto dasrc/lib/avatar-store.ts) - Migration
m7_scout_partite: nuova tabellascout_partiteper l'archivio delle partite scoutate concluse, e collegamento della tabellascout_sessioni(già presente nello schema ma mai usata) al blocco condiviso dello Scout Live — prima entrambi vivevano solo inlocalStorage, quindi visibili a un solo dispositivo
Moduli completati
- Squadra
- Presenze
- Badge
- Scout Live (blocco e archivio partite sincronizzati tra dispositivi, migration
m7_scout_partite) - Pagelle
- MVP
- Notifiche
- Profilo Giocatore (su
develop, specifica indocs/modules/profilo-giocatore.md)
Autenticazione e dashboard amministratore
Implementate su develop. Il login è l'unica via d'accesso (31/08/2026): la selezione
libera del giocatore non esiste più, senza sessione Google si resta su /benvenuto, e i
permessi di amministrazione arrivano solo da user_roles.
Attenzione all'ordine: finché il provider Google è spento in Supabase, «Accedi con Google» risponde
{"code":400,"error_code":"validation_failed","msg":"Unsupported provider: provider is not enabled"}
e nessuno entra nell'app, né in dev né sulla preview di develop. Il passo 1 qui sotto
va fatto prima di mandare questa versione in produzione.
Passaggi in ordine, nessuno dei quali è reversibile a metà:
- Provider Google in Supabase — Google Cloud Console: consent screen External (scope
emaileprofile, non sensibili: nessuna verifica richiesta, e la modalità Testing regge fino a 100 utenti, più che sufficiente per la squadra), credenziale Web application con redirect URIhttps://kfkcldwncxqaixetsjes.supabase.co/auth/v1/callback. Client ID e secret in Authentication → Providers → Google. In URL Configuration: Site URL di produzione, piùlocalhost:8080e il wildcard delle preview Vercel tra i Redirect URLs. Per provare sullo stack locale invece che sul cloud servono ancheenabled = truein[auth.external.google]disupabase/config.toml, le due variabiliSUPABASE_AUTH_GOOGLE_*in.enve una credenziale con redirect URIhttp://127.0.0.1:54321/auth/v1/callback. - Migration M2 e M3 (
supabase db push). SonoCREATEpuri: si possono applicare in produzione senza toccare il comportamento attuale. - Primo admin, dopo il primo login (l'ID esiste solo da quel momento):
INSERT INTO public.user_roles (user_id, role) SELECT id, 'admin' FROM auth.users WHERE email = '<mail>'; - Collegamento dei 17 account: ciascuno accede con Google e viene collegato in
automatico al proprio giocatore per email (DD-018, migration
m5_email_giocatori_squadra) — nessuna scelta manuale. Finché l'email di un giocatore non è impostata (oggi solo 2 dei 17 la hanno), il suo accesso mostra un errore e va sbloccato aggiungendo l'email con una nuova migration. Uno slot già collegato può essere liberato solo da un admin. - Solo a squadra collegata: migration
m4_solo_autenticati, che toglie al ruoloanonl'accesso alle tabelle v1.0. Da lì in poi i dati sono raggiungibili solo con una sessione; le route insrc/routes/api/public/usano la service role e continuano a funzionare.
Attenzione: dev e produzione condividono lo stesso progetto Supabase. Un account di prova che collega uno slot lo occupa anche in produzione, e va liberato da un admin.
Prossimo sviluppo
Gestione tesseramenti CSI: la raccolta dati e l'export CSV sono pronti, manca il tracciamento di chi è già tesserato (numero e data di tessera).
Note
Il progetto segue una metodologia document-first.
Ogni nuova funzionalità viene progettata nella cartella docs/modules/ prima di essere implementata.