src/EventSubscriber/CqsEventSubscriber.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Aviso;
  4. use App\Entity\ConsorciPropietarioContenido;
  5. use App\Enum\TipoAvisoEnum;
  6. use App\Interfaces\AvisoRepositoryInterface;
  7. use App\Services\AsymmetricEncryptionService;
  8. use App\Services\EventDomain\CqsChangedEvent;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Psr\Log\LoggerInterface;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  13. use Symfony\Contracts\Translation\TranslatorInterface;
  14. class CqsEventSubscriber implements EventSubscriberInterface
  15. {
  16. public function __construct(
  17. private AsymmetricEncryptionService $asymmetricEncryptionService,
  18. private AvisoRepositoryInterface $avisoRepository,
  19. private TranslatorInterface $translator,
  20. private UrlGeneratorInterface $urlGenerator,
  21. private EntityManagerInterface $em,
  22. private LoggerInterface $logger,
  23. )
  24. {
  25. }
  26. public static function getSubscribedEvents()
  27. {
  28. return [
  29. CqsChangedEvent::class => 'onCqsChanged',
  30. ];
  31. }
  32. public function onCqsChanged(CqsChangedEvent $event): void
  33. {
  34. try {
  35. $respuesta = $event->getRespuesta();
  36. // INC-753 v2: el aviso CQS debe ser visible al panel CONSORCI.
  37. // Aviso.propietarioContenido es ManyToOne (singular), por tanto se crea
  38. // un Aviso por cada CONSORCI activo (broadcast por rol). El evento no
  39. // expone un destinatario CONSORCI especifico y la respuesta no tiene
  40. // una relacion directa al consorci, por lo que se notifica a todos.
  41. $consorcis = $this->em->getRepository(ConsorciPropietarioContenido::class)
  42. ->findBy(['intercambioMensajes' => 1]);
  43. if (empty($consorcis)) {
  44. $this->logger->warning('CqsEventSubscriber: no se encontraron CONSORCI destinatarios para aviso CQS', [
  45. 'respuestaId' => $respuesta?->getId(),
  46. ]);
  47. return;
  48. }
  49. $asunto = $this->translator->trans('new.ads.cqs', [], 'ads');
  50. $url = $this->urlGenerator->generate(
  51. 'dashboard_solicitud_categoria_list',
  52. ['solicitud_categoria' => 'test'],
  53. UrlGeneratorInterface::ABSOLUTE_URL
  54. );
  55. foreach ($consorcis as $consorci) {
  56. $aviso = new Aviso();
  57. $aviso->setTipo(TipoAvisoEnum::AVISO_CQS);
  58. $aviso->setFecha(new \DateTime());
  59. $aviso->setAsunto($asunto);
  60. $aviso->setPropietarioContenido($consorci);
  61. $aviso->setObject($respuesta);
  62. $aviso->setDeletedAt(null);
  63. $token = $this->asymmetricEncryptionService->hybridEncrypt([
  64. 'tipoAviso' => TipoAvisoEnum::AVISO_CQS,
  65. 'propietarioId' => $consorci->getId(),
  66. 'url' => $url,
  67. ]);
  68. $aviso->setTokenHash($token);
  69. $this->avisoRepository->save($aviso);
  70. }
  71. } catch (\Exception $e) {
  72. $this->logger->error('Error al generar aviso CQS: ' . $e->getMessage(), [
  73. 'respuestaId' => $event->getRespuesta()?->getId(),
  74. 'exception' => $e,
  75. ]);
  76. }
  77. }
  78. }