src/EventSubscriber/ChatEventSubscriber.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Aviso;
  4. use App\Entity\PropietarioContenido;
  5. use App\Enum\TipoAvisoEnum;
  6. use App\Interfaces\AvisoRepositoryInterface;
  7. use App\Interfaces\ChatRepositoryInterface;
  8. use App\Interfaces\ParticipanteChatRepositoryInterface;
  9. use App\Interfaces\PropietarioContenidoRepositoryInterface;
  10. use App\Repository\RepositoryRegistry;
  11. use App\Repository\WebServices\PropietarioContenidoWSRepository;
  12. use App\Services\AsymmetricEncryptionService;
  13. use App\Services\EventDomain\ChatChangedEvent;
  14. use DateTime;
  15. use Doctrine\Common\Collections\Criteria;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  18. use Symfony\Component\Translation\Translator;
  19. class ChatEventSubscriber implements EventSubscriberInterface
  20. {
  21. public function __construct(
  22. private AsymmetricEncryptionService $asymmetricEncryptionService,
  23. private PropietarioContenidoRepositoryInterface $propietarioContenidoRepository,
  24. private AvisoRepositoryInterface $avisoRepository,
  25. private Translator $translator,
  26. private UrlGeneratorInterface $urlGenerator,
  27. private ChatRepositoryInterface $chatRepository,
  28. private ParticipanteChatRepositoryInterface $participanteChatRepository,
  29. private PropietarioContenidoWSRepository $propietarioContenidoWSRepository,
  30. )
  31. {
  32. }
  33. public static function getSubscribedEvents()
  34. {
  35. return [
  36. ChatChangedEvent::class => 'onChangedChat',
  37. ];
  38. }
  39. public function onChangedChat(ChatChangedEvent $event): void
  40. {
  41. $chatData = $event->getChat();
  42. $chat = $this->chatRepository->findById(@$chatData['chatId']);
  43. $criteria = new Criteria();
  44. $criteria->andWhere(Criteria::expr()->eq("chat", $chatData['chatId']));
  45. $participantesChat = $this->participanteChatRepository->find($criteria);
  46. foreach ($participantesChat as $participante) {
  47. if($participante->getParticipante() === @$chatData['emisor']) continue;
  48. list($nameObject, $id) = explode(':', $participante->getParticipante());
  49. if($nameObject !== 'PropietarioContenido') continue;
  50. $participante = $this->propietarioContenidoWSRepository->findById($id);
  51. $criteria = new Criteria();
  52. $criteria->andWhere(Criteria::expr()->eq("uuid", $participante->getUuid()));
  53. $participante = $this->propietarioContenidoRepository->find($criteria);
  54. if(!$participante->count()) continue;
  55. $participante = $participante->first();
  56. $avisosPropietario = $this->avisoRepository->getAvisosChatByPropietarioChat($participante, @$chatData['chatId']);
  57. $i = 0;
  58. $aviso = new Aviso();
  59. foreach ($avisosPropietario as $avisoPropietario)
  60. {
  61. if($i !== 0)
  62. {
  63. $this->avisoRepository->delete($avisoPropietario, true);
  64. }
  65. else
  66. {
  67. $aviso = $avisoPropietario;
  68. }
  69. $i++;
  70. }
  71. $aviso->setTipo(TipoAvisoEnum::AVISO_CHAT);
  72. $aviso->setFecha(new DateTime());
  73. $aviso->setAsunto($this->translator->trans('new.ads.chat', ['%chat%' => $chat->getTitulo() ?? '---'], 'ads'));
  74. $aviso->setPropietarioContenido($participante);
  75. $aviso->setObject($chat);
  76. $aviso->setDeletedAt(null);
  77. $token = $this->asymmetricEncryptionService->hybridEncrypt([
  78. 'tipoAviso' => TipoAvisoEnum::AVISO_CHAT,
  79. 'propietarioId' => $aviso->getPropietarioContenido()?->getId(),
  80. 'url' => $this->urlGenerator->generate('chat', ['id' => @$chatData['chatId']],UrlGeneratorInterface::ABSOLUTE_URL),
  81. ]);
  82. $aviso->setTokenHash($token);
  83. $this->avisoRepository->save($aviso);
  84. }
  85. }
  86. }