Analyse — Modules fonctionnels & RBAC¶
Produit le 2026-06-14 à partir des documents : architecture-fonctionnelle, profils-utilisateurs-permissions, implementation-rbac-v2
1. Architecture fonctionnelle vs Backend existant¶
Modules couverts ✅¶
| Module doc | Modules backend | Statut |
|---|---|---|
| Authentification & Sécurité | Auth |
Complet |
| Admin & Référentiels | Administration + Referentiels |
Complet |
| Acteurs de terrain | MaitresCoraniques + Tuteurs + Parents |
Complet (Parents créé le 2026-06-13) |
| Identification & Suivi | Enfants + Accompagnements |
Partiel — SuiviAccompagnement et CasOriente à vérifier |
| Audit applicatif | Dispersé dans Auth |
Partiel — pas de module Audit autonome |
Modules partiels — complément nécessaire 🔶¶
| Module doc | Backend | Ce qui manque |
|---|---|---|
| Sensibilisation & Communication | Formations (FormationSensibilisation + ParticipationFormation seulement) |
SupportCommunication, DistributionSupport, EmissionRadio, EducateurPair |
| Études, Diagnostic & Pilotage | Rapports (tableaux de bord) |
EtudeDiagnostique, IndicateurSuivi, MesureIndicateur sans use cases ni routes |
Modules complètement absents ❌¶
| Module doc | Modèles Prisma concernés | Note |
|---|---|---|
| Insertion Socio-Économique | ParcoursInsertion |
Modèle Prisma présent dans le schéma, 0 backend |
| Mobilisation Communautaire & Gouvernance | ComiteVillageois, MembreComite, ReunionComite, CadreConcertation, SessionConcertation, SessionParoleJeunes, ParticipationSession |
7 modèles Prisma présents, 0 backend |
2. Analyse RBAC — documents 2 et 3 vs schéma existant¶
Ce que le schéma a déjà¶
ProfilUtilisateur dans le schéma est exactement le Role du document RBAC :
ProfilUtilisateur (schéma actuel) Role (document RBAC)
───────────────────────────────── ────────────────────
id: String (CUID) ≡ id: String (CUID)
code: String @unique ≡ code: String @unique
libelle: String ≡ libelle: String
description: String? ≡ description: String?
actif: Boolean ≡ actif: Boolean
utilisateurs: Utilisateur[] ≡ utilisateurs: Utilisateur[]
Utilisateur.profilId → ProfilUtilisateur est strictement identique à Utilisateur.roleId → Role du document.
Utilisateur.communeCode → Commune.code est déjà présent dans le schéma, ce qui couvre nativement l'isolation géographique proposée dans le RBAC.
Ce qui manque — 2 tables à ajouter¶
model Permission {
id String @id @default(cuid())
code String @unique // ex: "ENFANT_CREER"
libelle String
description String?
module String // ex: "ENFANTS", "PILOTAGE", "ADMIN"
profils ProfilPermission[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("permissions")
}
model ProfilPermission {
profilId String
permissionId String
profil ProfilUtilisateur @relation(fields: [profilId], references: [id])
permission Permission @relation(fields: [permissionId], references: [id])
@@id([profilId, permissionId])
@@map("profils_permissions")
}
ProfilUtilisateur reçoit en plus : permissions ProfilPermission[] (champ inverse, non destructif).
Ce sont des ajouts purs — aucune table ni colonne existante n'est modifiée.
Permissions à créer (seed initial)¶
Module ENFANTS : ENFANT_LIRE, ENFANT_CREER, ENFANT_MODIFIER, ENFANT_SUPPRIMER, ENFANT_VALIDER
Module ACCOMPAGNEMENT: ACCOMPAGNEMENT_CREER, ACCOMPAGNEMENT_LIRE, SUIVI_CREER, CAS_ORIENTE_CREER
Module ACTEURS : ACTEUR_CREER, ACTEUR_MODIFIER, ACTEUR_LIRE
Module PILOTAGE : INDICATEUR_LIRE, INDICATEUR_SAISIR, ETUDE_LIRE, ETUDE_CREER, RAPPORT_EXPORTER
Module MOBILISATION : MOBILISATION_LIRE, COMITE_GERER, CONCERTATION_GERER
Module SENSIBILISATION: FORMATION_CREER, FORMATION_LIRE, SUPPORT_GERER
Module INSERTION : INSERTION_CREER, INSERTION_LIRE, INSERTION_MODIFIER
Module ADMIN : UTILISATEUR_GERER, REFERENTIEL_MODIFIER
Module SYSTEM : ACCES_TOUTES_COMMUNES
Module AUDIT : AUDIT_LIRE
Matrice rôles × permissions¶
| Permission | AGENT_TERRAIN | MEAL_COMMUNAL | MEAL_NATIONAL | CHARGE_PROJET | ADMIN |
|---|---|---|---|---|---|
| ENFANT_LIRE | ✅ | ✅ | ✅ | ✅ | ✅ |
| ENFANT_CREER | ✅ | ✅ | ❌ | ❌ | ❌ |
| ENFANT_MODIFIER | ✅ | ✅ | ❌ | ❌ | ❌ |
| ENFANT_SUPPRIMER | ❌ | ❌ | ❌ | ❌ | ✅ |
| ENFANT_VALIDER | ❌ | ✅ | ✅ | ❌ | ✅ |
| ACCOMPAGNEMENT_CREER | ✅ | ✅ | ❌ | ❌ | ❌ |
| INDICATEUR_LIRE | ❌ | ✅ | ✅ | ✅ | ✅ |
| INDICATEUR_SAISIR | ❌ | ✅ | ✅ | ❌ | ✅ |
| RAPPORT_EXPORTER | ❌ | ✅ | ✅ | ✅ | ✅ |
| ACCES_TOUTES_COMMUNES | ❌ | ❌ | ✅ | ✅ | ✅ |
| UTILISATEUR_GERER | ❌ | ❌ | ❌ | ❌ | ✅ |
| AUDIT_LIRE | ❌ | ❌ | ❌ | ❌ | ✅ |
3. Plan d'implémentation RBAC (Backend)¶
Phase 0 — Schéma (1 fichier, prisma db push)¶
Ajouter Permission + ProfilPermission + champ inverse sur ProfilUtilisateur.
Phase 1 — Seed¶
Créer les 5 profils, les ~25 permissions, et toutes les liaisons ProfilPermission.
Phase 2 — Middlewares Express (3 fichiers)¶
authenticate.ts — charger les permissions du profil à chaque requête :
const utilisateur = await prisma.utilisateur.findUnique({
where: { id: payload.userId },
include: {
commune: true,
profil: {
include: { permissions: { include: { permission: true } } }
}
}
});
req.user = {
...utilisateur,
permissionCodes: utilisateur.profil.permissions.map(pp => pp.permission.code)
};
authorize.ts — vérification de permission sur une route :
export const authorize = (...permissionsRequises: string[]) =>
(req, res, next) => {
const ok = permissionsRequises.every(p => req.user.permissionCodes.includes(p));
if (!ok) return res.status(403).json({ succes: false, code: 'ACCES_REFUSE', message: 'Accès refusé' });
next();
};
scopeCommune.ts — filtre automatique par commune :
export const scopeCommune = (req, res, next) => {
req.communeFilter = req.user.permissionCodes.includes('ACCES_TOUTES_COMMUNES')
? {}
: { communeCode: req.user.communeCode };
next();
};
Phase 3 — Branchement sur les routes existantes¶
Ajouter authorize('PERMISSION_CODE') + scopeCommune sur chaque route de chaque module.
Phase 4 — Use cases admin RBAC (optionnel, pour UI admin)¶
ListerPermissionsUseCaseModifierPermissionsDuProfilUseCaseAttribuerProfilUtilisateurUseCase
4. Ordre de priorité recommandé¶
| Priorité | Action | Effort estimé |
|---|---|---|
| 1 | RBAC Phase 0 + 1 (schéma + seed) | 1 mission |
| 2 | RBAC Phase 2 + 3 (middlewares + branchement routes) | 1 mission |
| 3 | Compléter Module Sensibilisation (SupportCom, EmissionRadio, EducateurPair, DistributionSupport) | 1 mission |
| 4 | Module Insertion Socio-Économique (ParcoursInsertion) | 1 mission |
| 5 | Module Mobilisation Communautaire (7 modèles) | 1-2 missions |
| 6 | Module Pilotage complet (EtudeDiagnostique, IndicateurSuivi, MesureIndicateur) | 1 mission |
| 7 | Module Audit autonome (extraire de Auth, use cases dédiés) | 1 mission |