refactor(core) : RBAC Task 1 - polish apres revue qualite

- Permission : guards constructeur (code/label/module non vides, code avec point)
- Permission::revive() reutilise updateMetadata() pour eviter la duplication
- Suppression de SystemRolesTest (tautologique, ne capture aucun comportement)
- Role::permissions : commentaire explicite sur la raison du fetch EAGER
- Alignement des types de retour sur static (style User.php)
- Nouveau test Role::addPermission avec permissions distinctes

Ticket #343 - Task 1 polish (revue qualite).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-04-14 16:37:53 +02:00
parent f0ea9201f5
commit 0fc0b57e37
5 changed files with 84 additions and 35 deletions

View File

@@ -42,6 +42,15 @@ class Role
private bool $isSystem = false;
/** @var Collection<int, Permission> */
// Choix deliberé de fetch: 'EAGER' (durcissement, pas oubli de perf) :
// - Evite un lazy-load silencieux pendant un refresh de token JWT ou une
// serialisation hors contexte EntityManager (voir ticket #343, section
// 11 risque #1) ou la collection serait inaccessible et provoquerait
// une erreur opaque.
// - Compromis accepte : surcout SQL volontaire, acceptable a l'echelle
// d'un CRM/ERP PME ou un role porte quelques dizaines de permissions.
// - Si la volumetrie augmente significativement : revoir vers une
// projection cachee (ticket a ouvrir a ce moment-la).
#[ORM\ManyToMany(targetEntity: Permission::class, fetch: 'EAGER')]
#[ORM\JoinTable(name: 'role_permission')]
private Collection $permissions;
@@ -90,7 +99,7 @@ class Role
* Met a jour le libelle affichable du role. Le code reste immuable pour
* garantir la stabilite des references cote fixtures et migrations.
*/
public function setLabel(string $label): self
public function setLabel(string $label): static
{
$this->label = $label;
@@ -100,7 +109,7 @@ class Role
/**
* Met a jour la description libre du role (champ documentaire).
*/
public function setDescription(?string $description): self
public function setDescription(?string $description): static
{
$this->description = $description;
@@ -111,7 +120,7 @@ class Role
* Ajoute une permission au role. Idempotent : ajouter deux fois la meme
* permission n'entraine pas de doublon dans la collection.
*/
public function addPermission(Permission $permission): self
public function addPermission(Permission $permission): static
{
if (!$this->permissions->contains($permission)) {
$this->permissions->add($permission);
@@ -124,7 +133,7 @@ class Role
* Retire une permission du role. Idempotent : retirer une permission
* absente est un no-op silencieux.
*/
public function removePermission(Permission $permission): self
public function removePermission(Permission $permission): static
{
$this->permissions->removeElement($permission);