From ee624cae4b9f81320d65b5a671082799bfda7c43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 28 Jan 2026 16:18:45 +0100 Subject: [PATCH] Add `AuditTrailPersisterInterface` and improve `AuditTrailPersister` - Introduced `AuditTrailPersisterInterface` to define the persisting contract. - Updated `AuditTrailPersister` to implement the interface and delegate persistence to `AuditTrailRepository`. - Added `AuditTrailRepository` with `persistImmediately` method to save audit trails directly to the database. --- .../Audit/AuditTrailPersister.php | 10 +++- .../Audit/AuditTrailPersisterInterface.php | 19 ++++++ .../Repository/AuditTrailRepository.php | 58 +++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/Bundle/ChillMainBundle/Audit/AuditTrailPersisterInterface.php create mode 100644 src/Bundle/ChillMainBundle/Repository/AuditTrailRepository.php diff --git a/src/Bundle/ChillMainBundle/Audit/AuditTrailPersister.php b/src/Bundle/ChillMainBundle/Audit/AuditTrailPersister.php index 67277369f..3277ffca3 100644 --- a/src/Bundle/ChillMainBundle/Audit/AuditTrailPersister.php +++ b/src/Bundle/ChillMainBundle/Audit/AuditTrailPersister.php @@ -12,8 +12,14 @@ declare(strict_types=1); namespace Chill\MainBundle\Audit; use Chill\MainBundle\Entity\AuditTrail; +use Chill\MainBundle\Repository\AuditTrailRepository; -class AuditTrailPersister +final readonly class AuditTrailPersister implements AuditTrailPersisterInterface { - public function persistAuditTrail(AuditTrail $auditTrail): void {} + public function __construct(private AuditTrailRepository $auditTrailRepository) {} + + public function persistAuditTrail(AuditTrail $auditTrail): void + { + $this->auditTrailRepository->persistImmediately($auditTrail); + } } diff --git a/src/Bundle/ChillMainBundle/Audit/AuditTrailPersisterInterface.php b/src/Bundle/ChillMainBundle/Audit/AuditTrailPersisterInterface.php new file mode 100644 index 000000000..82e8c2208 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Audit/AuditTrailPersisterInterface.php @@ -0,0 +1,19 @@ + + */ +class AuditTrailRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, AuditTrail::class); + } + + /** + * Persist an AuditTrail without storing it in the entity manager. + */ + public function persistImmediately(AuditTrail $auditTrail): void + { + $metadata = $this->getClassMetadata(); + + $sql = $this->getEntityManager()->getConnection()->createQueryBuilder(); + $sql + ->insert($metadata->getTableName()) + ->values([ + 'id' => ':id', + 'action' => ':action', + 'occurredat' => ':occured_at', + 'user_id' => ':user_id', + 'description' => ':description', + 'targets' => ':targets', + 'metadata' => ':metadata', + ]) + ->setParameter('id', $auditTrail->getId()) + ->setParameter('action', $auditTrail->getAction()) + ->setParameter('occured_at', $auditTrail->getOccurredAt(), Types::DATETIMETZ_IMMUTABLE) + ->setParameter('user_id', $auditTrail->getUser()?->getId()) + ->setParameter('description', $auditTrail->getDescription()) + ->setParameter('targets', $auditTrail->getTargets(), Types::JSON) + ->setParameter('metadata', $auditTrail->getMetadata(), Types::JSON); + + $sql->executeQuery(); + } +}