- 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)
75 lines
2.0 KiB
PHP
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;
|
|
}
|
|
}
|