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

PermessoDefaultImpatto
can_view_reports✅ onAccesso alla coda segnalazioni
can_resolve_reports✅ onPuò chiudere/classificare segnalazioni
can_moderate_posts✅ onNasconde/ripristina post
can_moderate_events❌ offNasconde/cancella eventi
can_moderate_crews❌ offGestisce crew segnalate
can_warn_users✅ onInvia avvisi formali agli utenti
can_suspend_users❌ offSospende temporaneamente account
can_ban_users❌ offBanna permanentemente account
can_view_audit❌ offAccesso 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 SELECT solo sulla propria riga

contexts/ModeratorPermissionsContext.tsx (nuovo)

Context client-side che carica i permessi del moderatore loggato.

  • Gli admin ricevono tutti i permessi a true implicitamente
  • 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 moderatoradmin → 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.

VoceVisibile se
Panoramicasempre
Coda Segnalazionican_view_reports
Moderazione Contenutican_moderate_posts OR can_moderate_events OR can_moderate_crews
Utenti Segnalatican_warn_users OR can_suspend_users OR can_ban_users
Cronologia Azionisempre
Audit Logscan_view_audit
Impostazionisempre

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/reportscan_view_reports
  • /moderator/userscan_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.tsx
  • app/moderator/(dashboard)/reports/page.tsx
  • app/moderator/(dashboard)/users/page.tsx
  • app/admin/(dashboard)/moderators/page.tsx (nuovo)
  • components/dashboard/AdminSidebar.tsx
  • components/dashboard/ModeratorSidebar.tsx