<?php
namespace App\EventSubscriber;
use App\Entity\Aviso;
use App\Entity\Participante;
use App\Enum\ParticipantesGrupoEstado;
use App\Enum\TipoAvisoEnum;
use App\Interfaces\AvisoRepositoryInterface;
use App\Interfaces\PropietarioContenidoRepositoryInterface;
use App\Services\AsymmetricEncryptionService;
use App\Services\EventDomain\InscripcionCreatedEvent;
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 InscripcionEventSubscriber 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 [
InscripcionCreatedEvent::class => 'onCreatedInscripcion',
];
}
public function onCreatedInscripcion(InscripcionCreatedEvent $event): void
{
$participanteGrupo = $event->getParticipanteGrupo();
$propietario = $participanteGrupo->getParticipanteGrupoDetalle()->getParticipante();
$solicitud = $participanteGrupo->getGrupo()->getSolicitudAccionFormativa();
$curso = $solicitud->getCurso();
$entidadColaboradora = $solicitud->getExpediente()->getExpedientePerteneAEntidad()->getEntidadColaboradora();
$propietarios = $entidadColaboradora->getPropietarioContenidoEntidadColaboradoras()->toArray();
$propietarios[] = $propietario;
foreach ($propietarios as $propietario) {
$aviso = new Aviso();
$aviso->setTipo(TipoAvisoEnum::AVISO_CURSO_INSCRIPCION);
$aviso->setFecha(new DateTime());
$aviso->setAsunto($this->translator->trans('new.ads.curso.inscripcion.created',
['%curso%' => $curso->getNombre()[$this->requestStack->getCurrentRequest()->getLocale()]], 'ads'));
$aviso->setPropietarioContenido($propietario);
$aviso->setObject($participanteGrupo);
$aviso->setEntidad($entidadColaboradora);
$aviso->setCurso($curso);
$aviso->setDeletedAt(null);
if($propietario instanceof Participante) {
$url = $this->urlGenerator->generate('my_course_list',
['status' => ParticipantesGrupoEstado::PREINSCRITO],
UrlGeneratorInterface::ABSOLUTE_URL);
}
else
{
$url = $this->urlGenerator->generate('curso_detalle',
['id' => $solicitud->getId()],
UrlGeneratorInterface::ABSOLUTE_URL);
}
$token = $this->asymmetricEncryptionService->hybridEncrypt([
'tipoAviso' => TipoAvisoEnum::AVISO_CURSO_INSCRIPCION,
'propietarioId' => $aviso->getPropietarioContenido()?->getId(),
'url' => $url,
]);
$aviso->setTokenHash($token);
$this->avisoRepository->save($aviso);
}
}
}