Module sites (#8)
All checks were successful
Auto Tag Develop / tag (push) Successful in 6s

| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [x] Pas de régression
- [x] TU/TI/TF rédigée
- [x] TU/TI/TF OK
- [ ] CHANGELOG modifié

Co-authored-by: Matthieu <mtholot19@gmail.com>
Reviewed-on: #8
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #8.
This commit is contained in:
2026-04-20 15:31:58 +00:00
committed by Autin
parent 6b4868b261
commit 6cf5ef4cfc
77 changed files with 7739 additions and 80 deletions

View File

@@ -8,26 +8,50 @@ use App\Module\Core\Domain\Entity\Role;
use App\Module\Core\Domain\Entity\User;
use App\Module\Core\Domain\Repository\RoleRepositoryInterface;
use App\Module\Core\Domain\Security\SystemRoles;
use App\Module\Sites\Domain\Entity\Site;
use App\Module\Sites\Domain\Repository\SiteRepositoryInterface;
use App\Module\Sites\Infrastructure\DataFixtures\SitesFixtures;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use RuntimeException;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
/**
* Fixtures de base du module Core : 3 utilisateurs (1 admin + 2 standards)
* rattaches aux roles systeme RBAC seedes par la migration Version20260414150034.
* rattaches aux roles systeme RBAC seedes par la migration Version20260414150034,
* puis (ticket 2 module Sites) rattaches a au moins un site avec un currentSite
* coherent.
*
* Note : le purger Doctrine execute avant load() supprime l'ensemble des
* entites managees, ce qui inclut la table role. On re-seede donc les roles
* systeme de maniere idempotente avant de rattacher les utilisateurs, afin
* que le workflow "make db-reset && make fixtures" reste one-shot.
*
* Dependance explicite a SitesFixtures (ticket 2) : les 3 sites Chatellerault,
* Saint-Jean et Pommevic doivent etre presents en base avant d'etre rattaches
* aux users. L'inversion volontaire de l'ordre (AppFixtures ← SitesFixtures)
* casse l'independance declaree au ticket 1 : c'est un couplage assume car
* apres ticket 2 le modele metier exprime un besoin legitime de rattachement.
*/
class AppFixtures extends Fixture
class AppFixtures extends Fixture implements DependentFixtureInterface
{
public function __construct(
private readonly UserPasswordHasherInterface $passwordHasher,
private readonly RoleRepositoryInterface $roleRepository,
private readonly SiteRepositoryInterface $siteRepository,
) {}
/**
* @return array<int, class-string>
*/
public function getDependencies(): array
{
// SitesFixtures doit tourner AVANT AppFixtures pour que les sites
// soient disponibles au rattachement des users ci-dessous.
return [SitesFixtures::class];
}
public function load(ObjectManager $manager): void
{
$adminRole = $this->ensureSystemRole(
@@ -43,23 +67,43 @@ class AppFixtures extends Fixture
'Role de base sans permission specifique',
);
// Recupere les 3 sites seedes par SitesFixtures. Si absents, c'est
// une misconfiguration (fixture hors purge ou dependance ignoree) :
// on fail fort avec un message explicite plutot que de continuer
// avec des users orphelins de site.
$chatellerault = $this->requireSite('Chatellerault');
$saintJean = $this->requireSite('Saint-Jean');
$pommevic = $this->requireSite('Pommevic');
$admin = new User();
$admin->setUsername('admin');
$admin->setIsAdmin(true);
$admin->setPassword($this->passwordHasher->hashPassword($admin, 'admin'));
$admin->addRbacRole($adminRole);
// Admin rattache aux 3 sites pour faciliter le dev / les tests manuels.
$admin->addSite($chatellerault);
$admin->addSite($saintJean);
$admin->addSite($pommevic);
$admin->setCurrentSite($chatellerault);
$manager->persist($admin);
$alice = new User();
$alice->setUsername('alice');
$alice->setPassword($this->passwordHasher->hashPassword($alice, 'alice'));
$alice->addRbacRole($userRole);
// Alice : un seul site, site courant = ce site.
$alice->addSite($chatellerault);
$alice->setCurrentSite($chatellerault);
$manager->persist($alice);
$bob = new User();
$bob->setUsername('bob');
$bob->setPassword($this->passwordHasher->hashPassword($bob, 'bob'));
$bob->addRbacRole($userRole);
// Bob : site different de Alice, pour prouver le filtrage par site
// dans les futurs tests (ticket 4 outillage SiteAware).
$bob->addSite($saintJean);
$bob->setCurrentSite($saintJean);
$manager->persist($bob);
$manager->flush();
@@ -90,4 +134,19 @@ class AppFixtures extends Fixture
return $role;
}
private function requireSite(string $name): Site
{
$site = $this->siteRepository->findByName($name);
if (null === $site) {
throw new RuntimeException(sprintf(
'SitesFixtures doit avoir seede le site "%s" avant le chargement des users. '
.'Verifier que SitesFixtures est bien en dependance de AppFixtures.',
$name,
));
}
return $site;
}
}