- Nouveau rôle users.role='moderator' (contrainte CHECK migrée via DROP+ADD CONSTRAINT, idempotent) : accès à Membres, Rencontres, Inscriptions uniquement. Dashboard, Catégories (écriture), Contenu du site, Demandes d'adhésion et gestion des comptes restent admin-only, imposé côté serveur (requireAuth accepte désormais un tableau de rôles) - Nouvel onglet « Administrateurs » (admin-only) : créer un compte admin ou modérateur (mot de passe temporaire généré, même mécanique que pour les membres — visible tant que non changé, changement forcé à la première connexion), réinitialiser l'accès, promouvoir/rétrograder, supprimer. Garde-fous : impossible de se supprimer ou de se rétrograder soi-même, impossible de supprimer le dernier administrateur - users.full_name (colonne migrée) pour l'affichage des comptes staff - AccessCell/CredentialsModal extraits dans AccessControls.jsx, partagés entre la gestion des membres et celle des comptes admin/modérateur - AdminShell filtre ses onglets par rôle ; Espace.jsx route admin et modérateur vers le back-office Corrigé en cours de route : GET /api/admin/categories doit rester lisible par les modérateurs (nécessaire au formulaire membre) même si sa gestion en écriture reste admin-only — sans quoi le Promise.all du frontend échouait silencieusement et vidait la liste des membres. Vérifié : 34 + 21 tests existants toujours au vert, 26 nouveaux tests de permissions par rôle, parcours navigateur complet (création modérateur, connexion, changement forcé, menu restreint, accès aux membres). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fkg15RCxNgUys4ru73He2o
10 lines
321 B
JavaScript
10 lines
321 B
JavaScript
// Thrown by access-management helpers (member/staff account creation and
|
|
// resets) for expected, user-facing failures — routes map these to the
|
|
// right HTTP status instead of a generic 500.
|
|
export class AccessError extends Error {
|
|
constructor(status, message) {
|
|
super(message);
|
|
this.status = status;
|
|
}
|
|
}
|