<?php
namespace App\EventSubscriber;
use ApiPlatform\Symfony\EventListener\EventPriorities;
use App\Entity\Compliance;
use App\Entity\Document;
use App\Entity\Section;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use DateTimeImmutable;
final class LastUpdateComplianceSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
public function __construct(EntityManagerInterface $entityManager,)
{
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['lastUpdateCompliance', EventPriorities::POST_WRITE],
];
}
public function lastUpdateCompliance(ViewEvent $event): void
{
$event->getControllerResult() ? $entityInstance = $event->getControllerResult(): $entityInstance = $event->getRequest()->get('data');
$method = $event->getRequest()->getMethod();
if (($entityInstance instanceof Compliance) && (Request::METHOD_PUT === $method || Request::METHOD_POST === $method || Request::METHOD_DELETE === $method)) {
$section = $entityInstance->getSection();
$this->updateSection($section);
$document = $section->getDocument();
$this->updateDocument($document);
} else if (($entityInstance instanceof Section) && Request::METHOD_DELETE === $method) {
$document = $entityInstance->getDocument();
$this->updateDocument($document);
} else {
return;
}
}
public function updateSection($section): void
{
$idSection = $section->getId();
try {
$sql = "select max(c.last_update_compliance) as last_update_compliance from compliance c
where c.section_id = $idSection";
$conn = $this->entityManager->getConnection();
$stmt = $conn->prepare($sql);
$lastUpdateCompliance = $stmt->executeQuery();
$lastUpdateCompliance = $lastUpdateCompliance->fetchAssociative();
$lastUpdateCompliance = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $lastUpdateCompliance['last_update_compliance']);
$lastUpdateCompliance ? $section->setLastUpdateCompliance($lastUpdateCompliance): $section->setLastUpdateCompliance(null);
$this->entityManager->persist($section);
$this->entityManager->flush();
} catch (\Throwable $e) {
header('Access-Control-Allow-Origin: *');
dd($e->getMessage());
}
}
public function updateDocument($document): void
{
$idDocument = $document->getId();
$sql = "select max(c.last_update_compliance) as last_update_compliance from compliance c , section s
where c.section_id = s.id and s.document_id = $idDocument";
$conn = $this->entityManager->getConnection();
$stmt = $conn->prepare($sql);
$lastUpdateCompliance = $stmt->executeQuery();
$lastUpdateCompliance = $lastUpdateCompliance->fetchAssociative();
$lastUpdateCompliance = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', $lastUpdateCompliance['last_update_compliance']);
$lastUpdateCompliance ? $document->setLastUpdateCompliance($lastUpdateCompliance): $document->setLastUpdateCompliance(null);
$this->entityManager->persist($document);
$this->entityManager->flush();
}
}