Files
CRAPP/docs/decisions/DD-052.md
T
davideandClaude Sonnet 5.5 9d047a6ecd Documentazione: DD-051 e DD-052, modulo MVP, database e changelog
Voto MVP definitivo, a pari merito, segreto e a tempo; nome del votato dalla rosa. PROJECT_STATE
segna che m35-m38 restano da applicare su Supabase (db push rinviato) e il lavoro su feature/gara.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 09:59:40 +01:00

2.5 KiB

DD-052 — Voto MVP segreto, nome dal database e votazione che si chiude

Data: 26 ottobre 2026
Stato: Accettata (migration m37 e m38)

Contesto
Dopo DD-051 il voto è definitivo e controllato a database, ma restavano tre difetti: chiunque poteva leggere da mvp_voti chi aveva votato chi; votato_nome lo scriveva il client e poteva non corrispondere a votato_id (il titolo andava all'id, il nome mostrato era un altro); e la votazione, una volta aperta, non si chiudeva mai.

Decisione

  • Voto segreto. La lettura diretta di mvp_voti è del solo votante (il proprio voto) e degli admin. La squadra legge i conteggi dalla vista mvp_voti_anonimi, una riga per voto senza votante_id e ordinata per candidato (la sequenza di arrivo non rivela nulla). La vista gira con i permessi del proprietario: è ciò che le permette di leggere tutte le righe senza esporre chi ha votato. Non è leggibile senza account.
  • Nome dal database. Un trigger riempie votato_nome da giocatori_squadra a partire da votato_id, ignorando quello inviato (anche se omesso, vuoto o diverso; e anche quando un admin corregge un voto). Se l'id non è in rosa resta il nome ricevuto. Lo stesso trigger vale per i badge social (m38), che avevano lo stesso difetto; le pagelle non hanno un nome del votato.
  • Chiusura. Il voto si apre 2 ore dopo l'inizio della partita e si chiude 24 ore dopo l'apertura (cioè 26 ore dopo l'inizio). A database lo impone voto_mvp_consentito(); nell'app votoMvpChiuso(). Gli admin restano fuori dal vincolo.
  • Tutte le partite. Il voto vale per ogni evento di tipo partita, amichevoli comprese (invariato).

Alternative scartate

  • Filtrare i voti solo nell'app → chi scrive su PostgREST li leggerebbe comunque.
  • Togliere la lettura anche agli admin → non potrebbero più correggere un voto sbagliato; restano gli unici a poter leggere la tabella, e l'app non mostra a nessuno chi ha votato chi.
  • Chiudere 24 ore dopo l'inizio della partita (22 ore di voto) → si è scelto 24 ore piene dall'apertura.

Conseguenze

  • Le partite già chiuse da più di 26 ore non si votano più: chi non aveva votato perde la possibilità. I voti già dati restano e contano.
  • I conteggi restano visibili durante la votazione: chi vota può vedere chi è in testa.
  • Un admin che legge la tabella dal database vede ancora chi ha votato chi.

Riesame
Se si vuole un voto davvero cieco, nascondere i risultati fino alla chiusura (la chiusura a 24 ore lo rende possibile).