Aller au contenu principal

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

EndpointGuard
POST /api/v1/workspace-rolesrequireFeature('customRoles')
PUT /api/v1/workspace-roles/:roleIdrequireFeature('customRoles')
DELETE /api/v1/workspace-roles/:roleIdrequireFeature('customRoles')

Les espaces de travail non Enterprise reçoivent 403 FEATURE_NOT_AVAILABLE.

Frontend

  • useFeatureAccess.ts : customRoles dé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 :

FREEPROENTERPRISE
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 : insertOnefindOneAndUpdate + 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

CoucheChangement
Backend tier.types.tscustomRoles ajouté à FeatureName
Backend FeatureGate.service.tsMapping customRoles → team.departments dans les deux feature maps
Backend workspaceRoles.routes.tsrequireFeature('customRoles') sur POST / PUT / DELETE
Backend UnifiedRole.model.tsunitId: required: false + 2 index uniques partiels
Backend pricing.controller.tsLigne 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.tscustomRoles: 'enterprise'
Frontend UnifiedRolesPage.tsxBouton "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.