Notes de version — 10 avril 2026
Cette version implémente le blocage par niveau pour les rôles personnalisés (RBAC) et corrige une erreur de collision d'index unique sur les rôles d'espace de travail.
Rôles personnalisés — Exclusif Enterprise (RBAC Tier-Gate)
Vue d'ensemble
La création, la modification et la suppression de rôles de permissions personnalisés sont désormais restreintes au plan Enterprise. Il s'agit du standard du secteur — Clockify et Toggl Track limitent également les rôles personnalisés à leur niveau le plus élevé.
Les rôles par défaut (Lecteur, Membre, Gestionnaire, Propriétaire) restent disponibles sur tous les plans sans changement.
Backend
| Endpoint | Guard |
|---|---|
POST /api/v1/workspace-roles | requireFeature('customRoles') |
PUT /api/v1/workspace-roles/:roleId | requireFeature('customRoles') |
DELETE /api/v1/workspace-roles/:roleId | requireFeature('customRoles') |
Les espaces de travail non Enterprise reçoivent 403 FEATURE_NOT_AVAILABLE.
Frontend
useFeatureAccess.ts:customRolesdéfini sur'enterprise'UnifiedRolesPage.tsx: le bouton "Nouveau rôle" est encapsulé dans<FeatureGate feature="customRoles">— masqué sur les plans FREE/PRO
Page de comparaison des prix
/api/v1/pricing-comparison retourne désormais une ligne custom-roles dans la catégorie Équipe & Collaboration :
| FREE | PRO | ENTERPRISE | |
|---|---|---|---|
| Rôles personnalisés |
Correctif : Collision d'index unique sur les rôles d'espace de travail
Problème
Les rôles d'espace de travail (scope : workspace) ont unitId: null car ils ne sont pas liés à une unité spécifique. L'index unique { unitId, scope, name } provoquait une erreur E11000 DuplicateKey à partir du deuxième espace de travail.
Impact : L'endpoint /api/v1/workspace-roles?scope=workspace retournait une liste vide pour tous les espaces de travail sauf le premier.
Correction
UnifiedRole.model.ts: Deux index uniques partiels (au lieu d'un)roleCopy.service.ts:insertOne→findOneAndUpdate + upsert(idempotent)- Script de migration exécuté : 25 bases de données d'unité réparées, rôles d'espace de travail manquants réinsérés
Récapitulatif des changements
| Couche | Changement |
|---|---|
Backend tier.types.ts | customRoles ajouté à FeatureName |
Backend FeatureGate.service.ts | Mapping customRoles → team.departments dans les deux feature maps |
Backend workspaceRoles.routes.ts | requireFeature('customRoles') sur POST / PUT / DELETE |
Backend UnifiedRole.model.ts | unitId: required: false + 2 index uniques partiels |
Backend pricing.controller.ts | Ligne custom-roles dans la catégorie Équipe & Collaboration |
Backend stripe.config.ts | 'Rôles personnalisés (RBAC)' dans la liste des fonctionnalités ENTERPRISE |
Frontend useFeatureAccess.ts | customRoles: 'enterprise' |
Frontend UnifiedRolesPage.tsx | Bouton "Nouveau rôle" encapsulé dans <FeatureGate> |
Disponibilité : Créer/modifier/supprimer des rôles personnalisés — Exclusif Enterprise. Rôles par défaut — tous les plans.