v0.1 — Moderator Permissions
Branch: v0.1/feat/moderator-permissions
Data: 24/03/2026
Tipo: feat (moderazione, admin panel, permessi granulari)
Contesto
Il ruolo “moderator” esisteva già nel DB ma senza configurazione granulare — ogni moderatore aveva teoricamente accesso a tutto. Con questa feature ogni moderatore ha una riga nella tabella moderator_permissions con flag booleani individuali che l’admin può attivare/disattivare.
Permessi disponibili
| Permesso | Default | Impatto |
|---|---|---|
can_view_reports | ✅ on | Accesso alla coda segnalazioni |
can_resolve_reports | ✅ on | Può chiudere/classificare segnalazioni |
can_moderate_posts | ✅ on | Nasconde/ripristina post |
can_moderate_events | ❌ off | Nasconde/cancella eventi |
can_moderate_crews | ❌ off | Gestisce crew segnalate |
can_warn_users | ✅ on | Invia avvisi formali agli utenti |
can_suspend_users | ❌ off | Sospende temporaneamente account |
can_ban_users | ❌ off | Banna permanentemente account |
can_view_audit | ❌ off | Accesso ai log di audit completi |
I permessi a default off sono quelli ad alto impatto (azioni irreversibili o visibilità privilegiata). Un admin deve abililitarli esplicitamente.
Modifiche apportate
DB — Migrazione Supabase
File: supabase/migrations/20260324000003_moderator_permissions.sql
CREATE TABLE public.moderator_permissions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL UNIQUE REFERENCES public.profiles(id) ON DELETE CASCADE,
can_view_reports BOOLEAN NOT NULL DEFAULT true,
can_resolve_reports BOOLEAN NOT NULL DEFAULT true,
can_moderate_posts BOOLEAN NOT NULL DEFAULT true,
can_moderate_events BOOLEAN NOT NULL DEFAULT false,
can_moderate_crews BOOLEAN NOT NULL DEFAULT false,
can_warn_users BOOLEAN NOT NULL DEFAULT true,
can_suspend_users BOOLEAN NOT NULL DEFAULT false,
can_ban_users BOOLEAN NOT NULL DEFAULT false,
can_view_audit BOOLEAN NOT NULL DEFAULT false,
granted_by UUID REFERENCES public.profiles(id),
notes TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);RLS:
- Admin:
FOR ALL … WITH CHECK(pieno controllo) - Moderatore:
FOR SELECTsolo sulla propria riga
contexts/ModeratorPermissionsContext.tsx (nuovo)
Context client-side che carica i permessi del moderatore loggato.
- Gli admin ricevono tutti i permessi a
trueimplicitamente - Espone
{ permissions, loading, isAdmin } - Usato dalla sidebar e dai PermissionGate
app/moderator/(dashboard)/layout.tsx
Aggiunto server-side role guard:
- Sessione assente → redirect a
/admin/login - Ruolo non
moderatornéadmin→ redirect a/unauthorized - Wrappa i children con
ModeratorPermissionsProvider
components/dashboard/ModeratorSidebar.tsx
Sidebar dinamica: mostra solo le voci per cui il moderatore ha il permesso.
| Voce | Visibile se |
|---|---|
| Panoramica | sempre |
| Coda Segnalazioni | can_view_reports |
| Moderazione Contenuti | can_moderate_posts OR can_moderate_events OR can_moderate_crews |
| Utenti Segnalati | can_warn_users OR can_suspend_users OR can_ban_users |
| Cronologia Azioni | sempre |
| Audit Logs | can_view_audit |
| Impostazioni | sempre |
Durante il caricamento i permessi non sono ancora noti → le voci condizionali sono nascoste fino al fetch completato (evita flash di contenuto).
components/moderator/PermissionGate.tsx (nuovo)
Componente wrapper per pagine singole:
<PermissionGate require="can_view_reports">
<ReportsPageInner />
</PermissionGate>Se il permesso manca mostra un messaggio “Accesso non autorizzato” al posto del contenuto.
Applicato a:
/moderator/reports→can_view_reports/moderator/users→can_warn_users
app/admin/(dashboard)/moderators/page.tsx (nuovo)
Pagina admin per gestire tutti i moderatori.
Funzionalità:
- Promuovi moderatore: inserisci email → imposta
role='moderator'+ crea riga perms - Lista espandibile: ogni moderatore mostra X/9 permessi attivi
- Toggle permessi: click diretto su ogni permesso per attivare/disattivare
- I permessi ad alto impatto sono evidenziati in rosso
- Revoca moderatore: torna a
role='user', elimina riga perms
components/dashboard/AdminSidebar.tsx
Aggiunta voce “Moderatori” → /admin/moderators.
File modificati / creati
supabase/migrations/20260324000003_moderator_permissions.sql(nuovo)contexts/ModeratorPermissionsContext.tsx(nuovo)components/moderator/PermissionGate.tsx(nuovo)app/moderator/(dashboard)/layout.tsxapp/moderator/(dashboard)/reports/page.tsxapp/moderator/(dashboard)/users/page.tsxapp/admin/(dashboard)/moderators/page.tsx(nuovo)components/dashboard/AdminSidebar.tsxcomponents/dashboard/ModeratorSidebar.tsx