<?php
namespace App\EventSubscriber;
use App\Entity\Aviso;
use App\Entity\ConsorciPropietarioContenido;
use App\Enum\TipoAvisoEnum;
use App\Interfaces\AvisoRepositoryInterface;
use App\Services\AsymmetricEncryptionService;
use App\Services\EventDomain\CqsChangedEvent;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class CqsEventSubscriber implements EventSubscriberInterface
{
public function __construct(
private AsymmetricEncryptionService $asymmetricEncryptionService,
private AvisoRepositoryInterface $avisoRepository,
private TranslatorInterface $translator,
private UrlGeneratorInterface $urlGenerator,
private EntityManagerInterface $em,
private LoggerInterface $logger,
)
{
}
public static function getSubscribedEvents()
{
return [
CqsChangedEvent::class => 'onCqsChanged',
];
}
public function onCqsChanged(CqsChangedEvent $event): void
{
try {
$respuesta = $event->getRespuesta();
// INC-753 v2: el aviso CQS debe ser visible al panel CONSORCI.
// Aviso.propietarioContenido es ManyToOne (singular), por tanto se crea
// un Aviso por cada CONSORCI activo (broadcast por rol). El evento no
// expone un destinatario CONSORCI especifico y la respuesta no tiene
// una relacion directa al consorci, por lo que se notifica a todos.
$consorcis = $this->em->getRepository(ConsorciPropietarioContenido::class)
->findBy(['intercambioMensajes' => 1]);
if (empty($consorcis)) {
$this->logger->warning('CqsEventSubscriber: no se encontraron CONSORCI destinatarios para aviso CQS', [
'respuestaId' => $respuesta?->getId(),
]);
return;
}
$asunto = $this->translator->trans('new.ads.cqs', [], 'ads');
$url = $this->urlGenerator->generate(
'dashboard_solicitud_categoria_list',
['solicitud_categoria' => 'test'],
UrlGeneratorInterface::ABSOLUTE_URL
);
foreach ($consorcis as $consorci) {
$aviso = new Aviso();
$aviso->setTipo(TipoAvisoEnum::AVISO_CQS);
$aviso->setFecha(new \DateTime());
$aviso->setAsunto($asunto);
$aviso->setPropietarioContenido($consorci);
$aviso->setObject($respuesta);
$aviso->setDeletedAt(null);
$token = $this->asymmetricEncryptionService->hybridEncrypt([
'tipoAviso' => TipoAvisoEnum::AVISO_CQS,
'propietarioId' => $consorci->getId(),
'url' => $url,
]);
$aviso->setTokenHash($token);
$this->avisoRepository->save($aviso);
}
} catch (\Exception $e) {
$this->logger->error('Error al generar aviso CQS: ' . $e->getMessage(), [
'respuestaId' => $event->getRespuesta()?->getId(),
'exception' => $e,
]);
}
}
}