Rilettura completa della documentazione confrontata con il codice. Dove la doc diceva il falso l'ho corretta; dove aveva ragione lei ho corretto il codice. Autovoto (la doc aveva ragione) - migration m12_niente_autovoto: vincoli mvp_no_autovoto e badge_social_no_autovoto, gli stessi che pagelle_voti ha dalla v1.0. Le righe che li violano vengono cancellate prima dell'ALTER, altrimenti fallisce; in locale non ce n'erano. M11 garantisce solo che il voto sia firmato con il proprio votante_id, non che il votato sia un altro: eleggersi MVP restava a un POST di distanza. - VotazioneMvp non mostra più il votante nell'elenco, come già faceva VotoSocial. Test che guardavano la colonna sbagliata - scritture.test.ts verificava che aggiornato_il si muovesse, chiamandolo "quello che alimenta la serie di conferme". È l'opposto: la serie usa risposto_il, che il trigger di M9 deve tenere fermo. Ora il test prova a riscriverlo e controlla che il database abbia tenuto la prima risposta; prima passava anche senza trigger. - destinatariSollecito() esce dalla route sollecita-presenze e diventa una funzione pura in presenze.ts, con i suoi test — stesso trattamento di avvisiPalloniEvento. Tre riletture in meno - giocatori-squadra, scout-store e avatar-store usavano invalidateQueries dove il dato scritto era già noto: ora setQueryData, come il resto dell'app. Resta scout-live, dove il lock può averlo vinto un altro dispositivo. Documentazione riallineata - presenze.md, badge.md, mvp.md: i limiti su RLS aperta e route non autenticata erano superati da M11 e DD-024; - serie-presenze.md: il filtro è e.data < oggi, non <=, e l'evento di oggi non conta (conterebbe come assenza per tutti); aggiunta la tabella risposto_il/aggiornato_il; - ARCHITECTURE.md ed EFFICIENZA_CLOUD.md: una sola eccezione a setQueryData; - DATABASE.md: i vincoli delle tre tabelle di voto; - PROJECT_STATE.md: fermo a M9, ora arriva a M12. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
22 lines
1.1 KiB
SQL
22 lines
1.1 KiB
SQL
-- M12 — Nessuno si vota da solo, nemmeno parlando con PostgREST.
|
|
--
|
|
-- `pagelle_voti` ha il vincolo `pagelle_no_autovoto` fin dalla v1.0. Le altre due votazioni
|
|
-- no: l'MVP non escludeva l'auto-voto nemmeno in interfaccia (bastava toccare il proprio
|
|
-- nome nell'elenco), i badge social lo escludevano solo lì. M11 (DD-023) garantisce che il
|
|
-- voto sia firmato con il proprio `votante_id`, ma non dice niente su chi viene votato:
|
|
-- eleggersi MVP da soli restava a un POST di distanza, e il titolo finiva in
|
|
-- `mvpVintiPerGiocatore()` come qualsiasi altro.
|
|
--
|
|
-- Le righe già esistenti che violano la regola vanno cancellate prima del vincolo,
|
|
-- altrimenti l'ALTER fallisce: sono voti che non sarebbero mai dovuti esistere, non dati da
|
|
-- conservare. In locale non ce n'era nessuna.
|
|
|
|
DELETE FROM public.mvp_voti WHERE votante_id = votato_id;
|
|
DELETE FROM public.badge_social_voti WHERE votante_id = votato_id;
|
|
|
|
ALTER TABLE public.mvp_voti
|
|
ADD CONSTRAINT mvp_no_autovoto CHECK (votante_id <> votato_id);
|
|
|
|
ALTER TABLE public.badge_social_voti
|
|
ADD CONSTRAINT badge_social_no_autovoto CHECK (votante_id <> votato_id);
|