Migration m36: il voto MVP solo tra presenti e dopo 2 ore
voto_mvp_consentito() controlla partita, presenza (presente o ritardo) di votante e votato e l'attesa di 2 ore dall'inizio. Da applicare su Supabase con db push (non ancora fatto). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
215090d297
commit
92e7195357
1 file changed
+48
@@ -0,0 +1,48 @@
|
||||
-- M36 — Il voto MVP si controlla anche sulla presenza e sull'orario (DD-051)
|
||||
--
|
||||
-- Fino alla M35 il database controllava solo convocati e allenatori (`evento_permette_voto`): che
|
||||
-- votante e votato fossero presenti, e che fossero passate 2 ore dall'inizio, lo faceva solo l'app.
|
||||
-- Ora la policy di INSERT su `mvp_voti` usa `voto_mvp_consentito()`, che aggiunge:
|
||||
-- - l'evento è una partita;
|
||||
-- - votante e votato hanno risposto `presente` o `ritardo`;
|
||||
-- - sono passate 2 ore dall'inizio (stesso valore di ORE_ATTESA_MVP in src/lib/mvp-voti.ts).
|
||||
--
|
||||
-- È una funzione nuova e non una modifica di `evento_permette_voto`, perché questa è usata anche da
|
||||
-- pagelle e badge social, che non hanno queste regole. Gli admin restano fuori (policy M11): possono
|
||||
-- ancora correggere. L'ora si legge in Europe/Rome; un `ora` vuoto o non valido vale mezzanotte,
|
||||
-- come in `votoMvpAperto()`.
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.voto_mvp_consentito(
|
||||
p_match_id text, p_votante_id text, p_votato_id text
|
||||
) RETURNS boolean
|
||||
LANGUAGE sql STABLE AS $$
|
||||
SELECT public.evento_permette_voto(p_match_id, p_votante_id, p_votato_id, false)
|
||||
AND EXISTS (
|
||||
SELECT 1 FROM public.eventi_app e
|
||||
WHERE e.id = p_match_id
|
||||
AND e.tipo = 'partita'
|
||||
AND ((e.data + CASE WHEN e.ora ~ '^([01][0-9]|2[0-3]):[0-5][0-9]$'
|
||||
THEN e.ora::time ELSE time '00:00' END)
|
||||
AT TIME ZONE 'Europe/Rome') + interval '2 hours' <= now()
|
||||
)
|
||||
-- votante e votato sono diversi (mvp_no_autovoto): due righe = entrambi presenti
|
||||
AND (
|
||||
SELECT count(DISTINCT r.giocatore_id)
|
||||
FROM public.risposte_presenze r
|
||||
WHERE r.evento_id = p_match_id
|
||||
AND r.giocatore_id IN (p_votante_id, p_votato_id)
|
||||
AND r.stato IN ('presente', 'ritardo')
|
||||
) = 2;
|
||||
$$;
|
||||
|
||||
DROP POLICY "Ognuno registra il proprio voto MVP" ON public.mvp_voti;
|
||||
|
||||
CREATE POLICY "Ognuno registra il proprio voto MVP" ON public.mvp_voti
|
||||
FOR INSERT TO authenticated
|
||||
WITH CHECK (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.giocatori_squadra g
|
||||
WHERE g.id = votante_id AND g.auth_user_id = auth.uid()
|
||||
)
|
||||
AND public.voto_mvp_consentito(match_id, votante_id, votato_id)
|
||||
);
|
||||
Reference in new issue
Block a user