<?php
namespace App\EventSubscriber;
use App\Entity\Aviso;
use App\Entity\PropietarioContenido;
use App\Enum\TipoAvisoEnum;
use App\Interfaces\AvisoRepositoryInterface;
use App\Interfaces\ChatRepositoryInterface;
use App\Interfaces\ParticipanteChatRepositoryInterface;
use App\Interfaces\PropietarioContenidoRepositoryInterface;
use App\Repository\RepositoryRegistry;
use App\Repository\WebServices\PropietarioContenidoWSRepository;
use App\Services\AsymmetricEncryptionService;
use App\Services\EventDomain\ChatChangedEvent;
use DateTime;
use Doctrine\Common\Collections\Criteria;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Translation\Translator;
class ChatEventSubscriber implements EventSubscriberInterface
{
public function __construct(
private AsymmetricEncryptionService $asymmetricEncryptionService,
private PropietarioContenidoRepositoryInterface $propietarioContenidoRepository,
private AvisoRepositoryInterface $avisoRepository,
private Translator $translator,
private UrlGeneratorInterface $urlGenerator,
private ChatRepositoryInterface $chatRepository,
private ParticipanteChatRepositoryInterface $participanteChatRepository,
private PropietarioContenidoWSRepository $propietarioContenidoWSRepository,
)
{
}
public static function getSubscribedEvents()
{
return [
ChatChangedEvent::class => 'onChangedChat',
];
}
public function onChangedChat(ChatChangedEvent $event): void
{
$chatData = $event->getChat();
$chat = $this->chatRepository->findById(@$chatData['chatId']);
$criteria = new Criteria();
$criteria->andWhere(Criteria::expr()->eq("chat", $chatData['chatId']));
$participantesChat = $this->participanteChatRepository->find($criteria);
foreach ($participantesChat as $participante) {
if($participante->getParticipante() === @$chatData['emisor']) continue;
list($nameObject, $id) = explode(':', $participante->getParticipante());
if($nameObject !== 'PropietarioContenido') continue;
$participante = $this->propietarioContenidoWSRepository->findById($id);
$criteria = new Criteria();
$criteria->andWhere(Criteria::expr()->eq("uuid", $participante->getUuid()));
$participante = $this->propietarioContenidoRepository->find($criteria);
if(!$participante->count()) continue;
$participante = $participante->first();
$avisosPropietario = $this->avisoRepository->getAvisosChatByPropietarioChat($participante, @$chatData['chatId']);
$i = 0;
$aviso = new Aviso();
foreach ($avisosPropietario as $avisoPropietario)
{
if($i !== 0)
{
$this->avisoRepository->delete($avisoPropietario, true);
}
else
{
$aviso = $avisoPropietario;
}
$i++;
}
$aviso->setTipo(TipoAvisoEnum::AVISO_CHAT);
$aviso->setFecha(new DateTime());
$aviso->setAsunto($this->translator->trans('new.ads.chat', ['%chat%' => $chat->getTitulo() ?? '---'], 'ads'));
$aviso->setPropietarioContenido($participante);
$aviso->setObject($chat);
$aviso->setDeletedAt(null);
$token = $this->asymmetricEncryptionService->hybridEncrypt([
'tipoAviso' => TipoAvisoEnum::AVISO_CHAT,
'propietarioId' => $aviso->getPropietarioContenido()?->getId(),
'url' => $this->urlGenerator->generate('chat', ['id' => @$chatData['chatId']],UrlGeneratorInterface::ABSOLUTE_URL),
]);
$aviso->setTokenHash($token);
$this->avisoRepository->save($aviso);
}
}
}