<?php
namespace App\Listener;
use App\Entity\User;
use App\Message\LogMessage;
use App\Serializer\API\UserSerializer;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\Messenger\MessageBusInterface;
class ResponseListener
{
private EntityManagerInterface $em;
private MessageBusInterface $bus;
public function __construct(EntityManagerInterface $em, MessageBusInterface $bus)
{
$this->em = $em;
$this->bus = $bus;
}
/**
* @throws \JsonException
*/
public function onKernelResponse(ResponseEvent $event): ResponseEvent
{
$response = $event->getResponse();
$request = $event->getRequest();
$user = $request->attributes->get('user');
if ($response->headers->get('Content-Type') === 'application/json') {
$prevent = ['/api/login', '/api/refresh', '/web/login'];
if (isset($_ENV['LOGGER_KEY'], $_ENV['APP_ENV']) &&
$_ENV['LOGGER_KEY'] &&
$user instanceof User &&
!in_array($request->getRequestUri(), $prevent)) {
$data = [
'requestHeaders' => $request->headers->all(),
'requestContent' => $request->getContent(),
'requestUri' => $request->getUri(),
'requestMethod' => $request->getMethod(),
'requestIp' => $request->getClientIp(),
'responseCode' => $response->getStatusCode(),
'responseContent' => json_decode($response->getContent()?:'', true, 512, JSON_THROW_ON_ERROR),
'environment' => $_ENV['APP_ENV'],
'user' => UserSerializer::item($user)
];
$this->bus->dispatch(new LogMessage($data));
}
}
return $event;
}
public function onKernelException(ExceptionEvent $event): ExceptionEvent
{
$response = new JsonResponse(['error' => $event->getThrowable()->getMessage()]);
$event->setResponse($response);
return $event;
}
}