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(); + } +}