Documenta dashboard admin, profili e ambiente locale

Checklist "Fine lavoro" di AGENTS.md per il lavoro dei due commit precedenti.

- DATABASE.md: profili_giocatore creata, user_roles come fonte dei permessi, e
  la nuova sezione Storage per il bucket privato.
- ARCHITECTURE.md: autenticazione e ruoli tra i punti fermi, comandi dello stack
  Supabase locale; gli stessi comandi in CLAUDE.md.
- CHANGELOG.md: la voce è marcata come presente su develop e non ancora in
  produzione.
- PROJECT_STATE.md: i cinque passaggi per attivare login e dashboard in
  produzione, in ordine, con il redirect URI di Google e la query per il primo
  admin. Segnalato che dev e produzione condividono lo stesso database.
- TODO.md: la dashboard esce dal backlog; entra il profilo lato giocatore, senza
  il quale la dashboard resterebbe senza dati.
- modules/profilo-giocatore.md: registrate due scelte fatte in corso d'opera —
  solo Google al posto di "Google oppure Email", e "Visualizza profilo" come
  scheda in linea invece di una schermata separata.

ROADMAP.md resta con la casella non spuntata: la funzionalità è su develop, non
ancora rilasciata.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-30 17:58:24 +02:00
co-authored by Claude Opus 5
parent 255afde48e
commit 3f52e9cc54
8 changed files with 89 additions and 9 deletions
+5
View File
@@ -16,6 +16,11 @@ npm run build # build di produzione (nitro)
npm run lint # eslint (include prettier come regola)
npm run format # prettier --write .
npm run test # suite di test (test/); npm run test:all per quella completa
npx supabase start # database locale in Docker (migration applicate + seed)
npx supabase stop # spegne i container
npx supabase db reset # ricrea il database locale da zero
npx supabase db push # applica le migration al progetto cloud
```
Verifica minima prima di consegnare: `npm run lint` + `npm run test`.
+30 -2
View File
@@ -6,7 +6,9 @@ Ultimo aggiornamento: 30/08/2026
Fase corrente:
Backend migrato al nuovo Supabase proprietario. M1 completata. Profilo Giocatore da implementare (M2).
Backend migrato al nuovo Supabase proprietario. M1 completata. M2 e M3 scritte e da applicare.
Autenticazione Google e dashboard amministratore implementate su `develop`, da attivare in
produzione seguendo i passaggi più sotto. Profilo Giocatore lato giocatore ancora da fare.
---
@@ -56,9 +58,35 @@ Profilo Giocatore (specifica in `docs/modules/profilo-giocatore.md`)
---
## Autenticazione e dashboard amministratore
Implementate su `develop`, **non ancora attive in produzione**. Il codice è additivo: finché
i passaggi qui sotto non sono fatti, l'app si comporta esattamente come prima.
Passaggi in ordine, nessuno dei quali è reversibile a metà:
1. **Provider Google in Supabase** — Google Cloud Console: consent screen *External* (scope
`email` e `profile`, nessuna verifica richiesta), credenziale *Web application* con
redirect URI `https://kfkcldwncxqaixetsjes.supabase.co/auth/v1/callback`. Client ID e
secret in *Authentication → Providers → Google*. In *URL Configuration*: Site URL di
produzione, più `localhost:8080` e il wildcard delle preview Vercel tra i Redirect URLs.
2. **Migration M2 e M3** (`supabase db push`). Sono `CREATE` puri: si possono applicare in
produzione senza toccare il comportamento attuale.
3. **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>';`
4. **Collegamento dei 17 account**: ciascuno accede con Google e sceglie il proprio nome una
volta sola. Uno slot già collegato può essere liberato solo da un admin.
5. **Solo a squadra collegata**: `VITE_AUTH_OBBLIGATORIA=true` su Vercel (fa sparire la
selezione libera del giocatore), poi la migration che rimuove le policy `anon` dalle
tabelle v1.0. È l'unico passo che cambia il comportamento per tutti.
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
**M2**`profili_giocatore` + Supabase Storage privato + RLS
Profilo giocatore lato giocatore (caricamento di documento, certificato e foto tessera):
finché non esiste, la dashboard amministratore mostra profili vuoti.
---
+19 -1
View File
@@ -44,7 +44,12 @@ docs/ documentazione ufficiale
server functions, `attachSupabaseAuth`).
- **Supabase**: `src/integrations/supabase/client.ts` (browser/SSR, chiave publishable — file
generato) e `client.server.ts` (`supabaseAdmin`, solo server). `types.ts` è generato dallo
schema.
schema; finché non viene rigenerato, le tabelle introdotte da M1/M2 si usano tramite
`client-nuove-tabelle.ts`, con i tipi di riga dichiarati nei moduli di `src/lib/`.
- **Autenticazione**: login Google via Supabase Auth (`src/lib/auth.ts`, DD-011); i permessi
di amministrazione arrivano da `user_roles` (`src/lib/ruoli.ts`). La variabile
`VITE_AUTH_OBBLIGATORIA` decide se `/benvenuto` accetta ancora la selezione libera del
giocatore: finché è spenta, login e vecchio accesso convivono.
## Livello dati
@@ -95,6 +100,19 @@ npm run test:e2e # percorsi sull'app servita
npm run test:all # tutto
```
Database di sviluppo in locale (Docker), alternativo al progetto Supabase cloud:
```bash
npx supabase start # avvia lo stack locale e applica tutte le migration
npx supabase stop # spegne i container
npx supabase db reset # ricrea il database da zero: migration + supabase/seed.sql
npx supabase db push # applica le migration al progetto cloud
```
`supabase/seed.sql` popola qualche profilo di prova e gira **solo in locale**. Serve perché
il progetto cloud è uno solo, condiviso tra sviluppo e produzione: lo stack locale è il posto
dove provare le migration distruttive senza toccare i dati veri.
## Branch e flusso di sviluppo
- `main` → produzione, deploy automatico su Vercel.
+13
View File
@@ -6,6 +6,19 @@ qui: sta in [ROADMAP.md](ROADMAP.md).
## Versione attuale — agosto 2026
### Autenticazione e dashboard amministratore (su `develop`, non ancora in produzione)
- Login con Google tramite Supabase Auth (DD-011). Al primo accesso l'account si collega a
un giocatore di `giocatori_squadra`, e il collegamento non è più modificabile dal
giocatore stesso (DD-016 regola 2).
- I permessi di amministrazione arrivano da `user_roles` (`src/lib/ruoli.ts`) e non più
dalla lista di nomi in `crapp-data.ts`, che resta solo come ponte finché
`VITE_AUTH_OBBLIGATORIA` non viene acceso.
- Nuova schermata `/admin`: stato dei profili della squadra, download di documento,
certificato e foto tessera, export CSV per il tesseramento CSI.
- Migration `m2_profili_giocatore` (tabella dei profili) e `m3_bucket_profili` (bucket
privato), entrambe additive.
### Test
- Suite di test in `test/` (unit, integration, end-to-end) eseguita con bun,
+8 -2
View File
@@ -11,11 +11,17 @@ non in questo file.
|---|---|---|
| `giocatori_squadra` | Anagrafica operativa della squadra, con ID testuali (`g1``gN`), dati gestiti dagli admin (nome, cognome, numero, ruolo) e collegamento all'account (`auth_user_id`). | Introdotta dalla migration `m1_giocatori_squadra`, già popolata (17 giocatori) ma **non ancora letta dal codice**: la rosa arriva tuttora da `src/lib/crapp-data.ts`, che resta il fallback anche dopo il passaggio. Destinata a diventare la source of truth. Vedi DD-015 e DD-016. |
| `giocatori` | Anagrafica giocatori con UUID. | Presente ma **non usata** dal codice attuale: la convergenza è rinviata (DD-012, DD-014). |
| `profili_giocatore` | Dati personali, metadati del documento d'identità, certificato medico e path dei file, in relazione 1:1 con `giocatori_squadra`. | **Prevista** per la v1.1 (DD-016), non ancora creata. |
| `user_roles` | Ruoli applicativi (es. amministratore, giocatore). | |
| `profili_giocatore` | Dati personali, metadati del documento d'identità, certificato medico e path dei file, in relazione 1:1 con `giocatori_squadra`. | Creata dalla migration `m2_profili_giocatore` (DD-016). Letta da `src/lib/profili.ts`; le policy mostrano al giocatore solo il proprio profilo e all'admin tutti. I file non stanno qui: la tabella conserva i path nel bucket. |
| `user_roles` | Ruoli applicativi (es. amministratore, giocatore). | Fonte dei permessi di amministrazione, letta da `src/lib/ruoli.ts` (DD-011). Il primo admin va inserito a mano; vedi [PROJECT_STATE.md](../PROJECT_STATE.md). |
`giocatori_squadra` / `giocatori` sono usate da: Squadra, Profili, Presenze, Scout, Badge, Pagelle.
## Storage
| Bucket | Scopo | Note |
|---|---|---|
| `profili-giocatore` | Documento d'identità, certificato medico e foto tessera, in cartelle per giocatore (`<giocatore_id>/<sezione>.<est>`). | **Privato** e destinato a restare tale: contiene documenti e dati sanitari, che non devono mai avere URL pubblici (DD-016 regola 4). Il giocatore gestisce solo la propria cartella, l'admin può scaricare tutto tramite signed URL a scadenza breve. Creato dalla migration `m3_bucket_profili`. |
## Eventi e presenze
| Tabella | Scopo | Note |
+7 -1
View File
@@ -6,9 +6,16 @@ Solo il lavoro in corso o imminente. L'elenco completo delle funzionalità previ
## In corso
- Documentazione tecnica del progetto.
- Autenticazione Google e dashboard amministratore: implementate su `develop`. Restano da
fare, in quest'ordine: configurazione del provider Google in Supabase, applicazione delle
migration M2/M3, inserimento del primo admin in `user_roles`, collegamento dei 17 account,
e solo alla fine `VITE_AUTH_OBBLIGATORIA=true` + rimozione delle policy `anon`.
Stato di dettaglio in [PROJECT_STATE.md](../PROJECT_STATE.md).
## Prossimo
- Profilo giocatore lato giocatore: senza le schermate di caricamento di documento,
certificato e foto, la dashboard amministratore resta a zero dati.
- Certificati medici (roadmap v1.1).
- Gestione tesseramenti CSI (roadmap v1.1).
@@ -31,5 +38,4 @@ Non documentate nemmeno le route API pubbliche in `src/routes/api/public/` (`csi
## Backlog
- AI Allenamenti (roadmap v1.2).
- Dashboard amministratore (roadmap v1.1).
- Backup automatici (roadmap, idee future).
+6 -3
View File
@@ -31,7 +31,9 @@ Può:
### Primo accesso
1. Login tramite Google oppure Email.
1. Login tramite Google oppure Email. *Implementato con il solo Google: la squadra ha tutti
un account Google, e un secondo metodo è additivo (un bottone in più sulla stessa
schermata) il giorno che serve.*
2. Selezione del proprio giocatore.
3. Accesso alla Home.
@@ -134,7 +136,8 @@ Contiene.
## Dashboard amministratore
Gli amministratori dispongono di una schermata dedicata.
Gli amministratori dispongono di una schermata dedicata (`/admin`, raggiungibile da
Profilo → Impostazioni).
Per ogni giocatore vengono mostrati.
@@ -145,7 +148,7 @@ Per ogni giocatore vengono mostrati.
Azioni disponibili.
- Visualizza profilo
- Visualizza profilo (la scheda si apre in linea nell'elenco: nessuna schermata separata)
- Scarica certificato
- Scarica documento
- Scarica foto tessera
+1
View File
@@ -0,0 +1 @@
main