Files
Coltura/tests/Fixtures/SiteAware/FakeSiteAwareEntity.php
Matthieu fd5d3fe36f refactor(sites) : decouple module Sites via SiteInterface + leaks groupes user:list
- Introduit Shared/Domain/Contract/SiteInterface que Site implemente
- SiteAwareInterface + User.php typent contre SiteInterface (plus d'import
  direct Core -> Sites, respect regle CLAUDE.md 138)
- Exception SiteNotAuthorizedException deplacee dans Shared/, alias
  retrocompat dans le module
- Retire `sites` et `currentSite` des groupes `user:list` et `user:rbac:write`
  (info leak via /api/users, escalade core.users.manage -> sites.manage)
- User::$sites et User::$currentSite en fetch LAZY (N+1 sur /api/users paginee)
2026-04-20 16:46:27 +02:00

75 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Fixtures\SiteAware;
use App\Module\Sites\Domain\Entity\Site;
use App\Shared\Domain\Contract\SiteAwareInterface;
use App\Shared\Domain\Contract\SiteInterface;
use Doctrine\ORM\Mapping as ORM;
use InvalidArgumentException;
/**
* Entite fictive utilisee UNIQUEMENT en tests (ticket 4 module Sites).
*
* Implemente SiteAwareInterface pour valider que l'outillage
* (SiteScopedQueryExtension + SiteAwareInjectionProcessor) se comporte
* correctement sans avoir a adopter le pattern sur une entite metier
* reelle. Le mapping Doctrine n'est charge qu'en environnement `test`
* via un bloc `when@test` dans `config/packages/doctrine.yaml`, donc
* cette classe n'existe jamais dans un schema prod.
*
* Le nom de table `fake_site_aware_entity` est volontairement verbeux
* pour reduire le risque de collision avec une future table metier.
*/
#[ORM\Entity]
#[ORM\Table(name: 'fake_site_aware_entity')]
class FakeSiteAwareEntity implements SiteAwareInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 100)]
private string $name;
#[ORM\ManyToOne(targetEntity: Site::class)]
#[ORM\JoinColumn(name: 'site_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
private ?Site $site = null;
public function __construct(string $name)
{
$this->name = $name;
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
public function getSite(): ?SiteInterface
{
return $this->site;
}
public function setSite(SiteInterface $site): void
{
if (!$site instanceof Site) {
throw new InvalidArgumentException('FakeSiteAwareEntity requires a concrete Site (Doctrine ManyToOne target).');
}
$this->site = $site;
}
}