Resout les 5 findings de la review automatique + couverture ManyToMany annoncee dans CLAUDE.md : - AuditListener : resolution de la classe via ClassMetadata plutot que `$entity::class` direct (defense proxy Doctrine : sous ORM 2 les lazies sont des `Proxies\__CG__\...`). Test de regression via getReference(). - AuditListener : capture des modifications de collections to-many (OneToMany / ManyToMany) via getScheduledCollectionUpdates / getScheduledCollectionDeletions. Les diffs sont mergees dans le changeset existant ou creent une entree "update" dediee. - AuditLogResource + Provider : filtre multi-valeurs `entity_type[]=X&entity_type[]=Y` (IN clause DBAL via ArrayParameterType::STRING), endpoint `/audit-log-entity-types` pour alimenter le MalioSelectCheckbox cote front. - audit-log.vue : refonte complete. Passage a `MalioDataTable`, composants `Malio*` (MalioInputText, MalioSelectCheckbox, MalioButton), suppression complete de la persistance URL (`readQuery` / `syncQuery` / `route.query`). `datetime-local` conserve avec TODO pointant l'exception CLAUDE.md. - AuditTimeline : fix du saut d'items 11-30. `PAGE_SIZE = 10` aligne avec un `itemsPerPage=10` passe au backend. Token anti-race pour ignorer les reponses tardives quand l'entite affichee change. - AuditLogDetail : affichage des diffs de collections to-many (+ / -) dans le tableau field/old/new existant. - logout.vue : ajout du `resetAuditLog()` au logout pour eviter qu'un user suivant (meme onglet) voie l'etat audit de l'ancien. - Permission / Role / Site : marquage `#[Auditable]`. - Version bump 0.1.32 → 0.1.34. Tests : 228 / 228 (221 assertions → 851, dont regressions proxy + M2M). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
53 lines
1.3 KiB
PHP
53 lines
1.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Module\Sites\Infrastructure\Doctrine;
|
|
|
|
use App\Module\Sites\Domain\Entity\Site;
|
|
use App\Module\Sites\Domain\Repository\SiteRepositoryInterface;
|
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
|
use Doctrine\Persistence\ManagerRegistry;
|
|
|
|
/**
|
|
* @extends ServiceEntityRepository<Site>
|
|
*/
|
|
class DoctrineSiteRepository extends ServiceEntityRepository implements SiteRepositoryInterface
|
|
{
|
|
public function __construct(ManagerRegistry $registry)
|
|
{
|
|
parent::__construct($registry, Site::class);
|
|
}
|
|
|
|
public function findById(int $id): ?Site
|
|
{
|
|
return $this->find($id);
|
|
}
|
|
|
|
public function findByName(string $name): ?Site
|
|
{
|
|
return $this->findOneBy(['name' => $name]);
|
|
}
|
|
|
|
/**
|
|
* @return list<Site>
|
|
*/
|
|
public function findAllOrderedByName(): array
|
|
{
|
|
// @var list<Site> $sites
|
|
return $this->findBy([], ['name' => 'ASC']);
|
|
}
|
|
|
|
public function save(Site $site): void
|
|
{
|
|
$this->getEntityManager()->persist($site);
|
|
$this->getEntityManager()->flush();
|
|
}
|
|
|
|
public function remove(Site $site): void
|
|
{
|
|
$this->getEntityManager()->remove($site);
|
|
$this->getEntityManager()->flush();
|
|
}
|
|
}
|