<?php
namespace App\EventSubscriber;
use App\Entity\Account;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class AccountSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
) {}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => [
['storeAdditionalDataToEntity', 10],
['addAdditionalDataToResponse', -10],
],
];
}
public function storeAdditionalDataToEntity(ResponseEvent $event): void
{
$requestRoute = $event->getRequest()->attributes->get('_route');
$persistRoutes = ['sulu_contact.post_account', 'sulu_contact.put_account'];
if (!\in_array($requestRoute, $persistRoutes, true)) {
return;
}
$account = $this->getEntityForResponse($event->getResponse());
if (!$account) {
return;
}
$requestData = $event->getRequest()->request->all();
$account->setIdentificationNumber($requestData['in']);
$account->setTaxIdentificationNumber($requestData['tin']);
$account->setCaseNumber($requestData['case_number']);
$this->entityManager->persist($account);
$this->entityManager->flush();
}
public function addAdditionalDataToResponse(ResponseEvent $event): void
{
$requestRoute = $event->getRequest()->attributes->get('_route');
$serializeRoutes = ['sulu_contact.get_account'];
if (!\in_array($requestRoute, $serializeRoutes, true)) {
return;
}
$account = $this->getEntityForResponse($event->getResponse());
if (!$account) {
return;
}
$responseData = json_decode($event->getResponse()->getContent() ?: '{}', true);
$responseData['in'] = $account->getIdentificationNumber();
$responseData['tin'] = $account->getTaxIdentificationNumber();
$responseData['case_number'] = $account->getCaseNumber();
$event->getResponse()->setContent(json_encode($responseData) ?: null);
}
protected function getEntityForResponse(Response $response): ?Account
{
$id = json_decode($response->getContent() ?: '{}', true)['id'] ?? null;
return $id ? $this->entityManager->getRepository(Account::class)->find($id) : null;
}
}