<?php
namespace App\EventSubscriber;
use App\Entity\Aviso;
use App\Enum\TipoAvisoEnum;
use App\Interfaces\AvisoRepositoryInterface;
use App\Interfaces\PropietarioContenidoRepositoryInterface;
use App\Services\AsymmetricEncryptionService;
use App\Services\EventDomain\InteresMarkedEvent;
use DateTime;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Translation\Translator;
class InteresEventSubscriber implements EventSubscriberInterface
{
public function __construct(
private AsymmetricEncryptionService $asymmetricEncryptionService,
private PropietarioContenidoRepositoryInterface $propietarioContenidoRepository,
private AvisoRepositoryInterface $avisoRepository,
private Translator $translator,
private UrlGeneratorInterface $urlGenerator,
private RequestStack $requestStack,
)
{
}
public static function getSubscribedEvents()
{
return [
InteresMarkedEvent::class => 'onMarkedInteres',
];
}
public function onMarkedInteres(InteresMarkedEvent $event): void
{
$solicitud = $event->getSolicitud();
$curso = $solicitud->getCurso();
$entidadColaboradora = $solicitud->getExpediente()->getExpedientePerteneAEntidad()->getEntidadColaboradora();
$propietarios = $entidadColaboradora->getPropietarioContenidoEntidadColaboradoras();
foreach ($propietarios as $propietario) {
$i = 0;
$aviso = new Aviso();
$avisosPropietario = $this->avisoRepository->getAvisosInteresByPropietarioCurso($entidadColaboradora, $curso);
foreach ($avisosPropietario as $avisoPropietario) {
if ($i !== 0) {
$this->avisoRepository->delete($avisoPropietario, true);
} else {
$aviso = $avisoPropietario;
}
$i++;
}
$aviso->setTipo(TipoAvisoEnum::AVISO_CURSO_INTERES);
$aviso->setFecha(new DateTime());
$aviso->setAsunto($this->translator->trans('new.ads.curso.interes', ['%curso%' => $curso->getNombre()[$this->requestStack->getCurrentRequest()->getLocale()]], 'ads'));
$aviso->setPropietarioContenido($propietario);
$aviso->setObject($solicitud);
$aviso->setEntidad($entidadColaboradora);
$aviso->setCurso($curso);
$aviso->setDeletedAt(null);
$token = $this->asymmetricEncryptionService->hybridEncrypt([
'tipoAviso' => TipoAvisoEnum::AVISO_CURSO_INTERES,
'propietarioId' => $aviso->getPropietarioContenido()?->getId(),
'url' => $this->urlGenerator->generate('curso_detalle', ['id' => $solicitud->getId()],
UrlGeneratorInterface::ABSOLUTE_URL),
]);
$aviso->setTokenHash($token);
$this->avisoRepository->save($aviso);
}
}
}