Aller au contenu

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.profilIdProfilUtilisateur est strictement identique à Utilisateur.roleIdRole du document.

Utilisateur.communeCodeCommune.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)

  • ListerPermissionsUseCase
  • ModifierPermissionsDuProfilUseCase
  • AttribuerProfilUtilisateurUseCase

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