← Phase 1 Overview / Back-office
⚙️
Module 8 — Phase 1 MVP

Back-office & Administration

Dashboard admin, file de modération, gestion des utilisateurs, messagerie simple et métriques plateforme. Interface web React séparée.

Backlog

User Stories

US8.1
En tant qu'admin, je vois un dashboard avec métriques clés (users actifs, posts/j, alerts actives)
must 5 pts
US8.2
En tant qu'admin, je peux rechercher et voir le profil d'un utilisateur
must 3 pts
US8.3
En tant qu'admin, je peux avertir, suspendre (7j/30j) ou bannir définitivement un compte
must 4 pts
US8.4
En tant que modérateur, je vois la file des contenus signalés, classés par gravité
must 5 pts
US8.5
En tant que modérateur, je peux masquer ou supprimer un post signalé
must 3 pts
US8.6
En tant que modérateur, je peux rejeter un signalement (contenu jugé OK)
must 2 pts
US8.7
En tant que super-admin, je peux gérer les rôles de l'équipe (créer, promouvoir, révoquer)
must 4 pts
US8.8
En tant que support, j'accède aux logs techniques sans voir les messages privés
must 3 pts
US8.9
En tant qu'utilisateur, je peux envoyer un message privé 1:1 (WebSocket)
should 8 pts
US8.10
En tant qu'utilisateur, je vois l'historique de mes conversations avec pagination cursor
should 3 pts
US8.11
En tant que système, toutes les actions admin sont tracées dans audit_logs
must 4 pts
Architecture Back-office

Stack & Rôles

Interface Admin (web séparée)

⚛️
React + Vite
SPA séparée du mobile — accès /admin uniquement réseau interne ou VPN
🎨
TailwindCSS + shadcn/ui
UI rapide et maintenable — pas besoin du design system NOMIIQ
🔐
Auth RBAC stricte
Rôles vérifiés via Guards NestJS. Token admin distinct (expiration 4h, pas de refresh long)
📊
Recharts
Graphiques KPIs — pas de dépendance BI externe en Phase 1
🔌
Axios + React Query
Mêmes endpoints API que le mobile mais avec routes /admin/* séparées

Matrice des Rôles & Permissions

Permission Mod. Support Admin Super
Voir file modération
Masquer/Supprimer post
Avertir utilisateur
Suspendre compte
Bannir compte
Voir logs techniques
Voir messages privés
Gérer les rôles
Gérer les clés API
Dashboard métriques
⚠️ Règle absolue : Aucun rôle ne peut accéder au contenu des messages privés (conversations). Le support ne peut voir que les métadonnées (user_id, created_at, conversation_id).
REST API /admin & /conversations

Endpoints API

Routes Admin

GET /admin/dashboard KPIs globaux (users, posts, sessions, alerts) 🔒 auth
GET /admin/users Liste users (search + filter + paginate) 🔒 auth
GET /admin/users/:id Détail admin d'un user (sans messages privés) 🔒 auth
POST /admin/users/:id/warn Avertir (body: reason) 🔒 auth
POST /admin/users/:id/suspend Suspendre (body: days, reason) 🔒 auth
POST /admin/users/:id/ban Bannir (body: reason) 🔒 auth
GET /admin/reports File modération (sorted by severity) 🔒 auth
POST /admin/reports/:id/action Action : hide|delete|reject|warn_author 🔒 auth
GET /admin/audit-logs Logs des actions admin (paginé) 🔒 auth
GET /admin/roles Liste équipe + rôles 🔒 auth
PATCH /admin/roles/:userId Modifier le rôle d'un membre 🔒 auth

Routes Messagerie

GET /conversations Mes conversations (paginé cursor) 🔒 auth
POST /conversations Démarrer une conversation (body: participant_id) 🔒 auth
GET /conversations/:id/messages Historique messages (cursor) 🔒 auth
POST /conversations/:id/messages Envoyer un message texte 🔒 auth
PATCH /conversations/:id/messages/:msgId/read Marquer comme lu 🔒 auth
DELETE /conversations/:id Quitter/Supprimer la conversation 🔒 auth
WebSocket Events (Socket.io)
conversation:join Rejoindre une room de conversation
message:send Envoyer un message (payload: {text, conversation_id})
message:received Recevoir un message en temps réel
message:read Confirmation de lecture
user:typing Indicateur "en train d'écrire"
RGPD + Traçabilité

Audit & Conformité

TABLE audit_logs
id UUID PRIMARY KEY admin_id UUID REFERENCES users(id) action TEXT NOT NULL -- 'user.ban', 'post.delete', 'role.change'... target_type TEXT -- 'user', 'post', 'comment'... target_id UUID reason TEXT metadata JSONB -- données contextuelles (avant/après) ip_address INET created_at TIMESTAMPTZ DEFAULT NOW() -- Rétention : 2 ans. Immuable (pas d'UPDATE/DELETE).
Critères d'acceptation
Dashboard admin charge en < 2s
Toute action admin crée un audit_log dans < 500ms
File de modération triée par score gravité (level × signalements)
Message WebSocket reçu en < 200ms sur réseau local
Aucune route admin accessible sans token rôle ≥ modérateur
Logs support : visibles métadonnées ONLY, contenu messages = [REDACTED]