feat(core) : RBAC Task 1 - entites Permission et Role + domaine securite

- Entite Permission avec methodes markOrphan/revive/updateMetadata
- Entite Role avec addPermission/removePermission/ensureDeletable
- Constantes SystemRoles (codes admin/user partages)
- Exception SystemRoleDeletionException pour la garde de suppression
- Tests unitaires couvrant le comportement domaine (pas de BDD)

Ticket #343 - 1/7 : fondations RBAC (domaine pur, sans persistence).
Les entites ne portent pas encore repositoryClass (ajoute en Task 2).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-04-14 16:30:15 +02:00
parent e3025bf2c9
commit f0ea9201f5
7 changed files with 459 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
<?php
declare(strict_types=1);
namespace App\Module\Core\Domain\Exception;
use App\Module\Core\Domain\Entity\Role;
use DomainException;
/**
* Levee lorsqu'une tentative de suppression vise un role marque comme systeme.
*
* Les roles systeme (ex : admin, user) sont proteges au niveau du domaine
* pour garantir qu'ils ne peuvent jamais etre retires par un administrateur,
* une commande ou un processus d'import. La traduction HTTP (403) est faite
* ailleurs, cette exception reste purement domaine.
*/
final class SystemRoleDeletionException extends DomainException
{
/**
* Construit l'exception a partir du role refuse a la suppression.
*/
public static function forRole(Role $role): self
{
return new self(sprintf('Le role systeme "%s" ne peut pas etre supprime.', $role->getCode()));
}
}