<?php
namespace App\EventSubscriber;
use App\Entity\AppUserEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Psr\Log\LoggerInterface;
use App\Event\EleveEvent;
use App\Event\CreditEvent;
use App\Event\EnseignantEvent;
use App\Event\InscriptionFormateurEvent;
use App\Event\InscriptionEleveEvent;
use App\Event\ValidationFormateurEvent;
use App\Event\VehiculeEvent;
use App\Controller\ApiEnseignantController;
use App\Cacher\ApiEleveCacher;
use App\Cacher\EnseignantCacher;
use App\Cacher\VehiculeEnseignantCacher;
use App\Cacher\PreSetCacher;
use App\Event\UserEvent;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class UserEventSubscriber implements EventSubscriberInterface
{
private $logger;
public function __construct(LoggerInterface $lifecycleLogger, EntityManagerInterface $entityManager, MailerInterface $mailer,
UrlGeneratorInterface $router,
ApiEleveCacher $eleve_cacher, EnseignantCacher $profcacher, VehiculeEnseignantCacher $vroum_cacher, PreSetCacher $cacher
)
{
$this->logger = $lifecycleLogger;
$this->eleve_cacher = $eleve_cacher;
$this->entityManager = $entityManager;
$cacher->setItemName('inscriptions');
$this->inscriptions_cacher = clone $cacher;
$this->prof_cacher = $profcacher;
$this->vroum_cacher = $vroum_cacher;
$cacher->setItemName('lifecycle');
$this->lifecycle_cacher = clone $cacher;
$this->mailer = $mailer;
$this->router = $router;
}
public static function getSubscribedEvents() : array
{
return [
EnseignantEvent::DELETE => 'onEnseignantDelete',
EnseignantEvent::UPDATE => 'onEnseignantUpdate',
EnseignantEvent::CREATE => 'onEnseignantCreate',
EnseignantEvent::UNSUSPENDED => 'onEnseignantUnsuspend',
EnseignantEvent::SUSPENDED => 'onEnseignantSuspend',
EleveEvent::DELETE => 'onEleveDelete',
EleveEvent::UPDATE => 'onEleveUpdate',
EleveEvent::CREATE => 'onEleveCreate',
CreditEvent::ADDED => 'onEleveCreditAdd',
InscriptionFormateurEvent::NAME => 'onInscriptionFormateurNew',
InscriptionEleveEvent::NAME => 'onInscriptionEleveNew',
InscriptionEleveEvent::VALIDATE => 'onInscriptionEleveValidate',
InscriptionFormateurEvent::VALIDATE => 'onInscriptionFormateurValidate',
ValidationFormateurEvent::NAME => 'onInscriptionValidate',
VehiculeEvent::EVALUATED => 'onVehiculeEvaluate',
VehiculeEvent::CREATED => 'onVehiculeCreate',
VehiculeEvent::UPDATED => 'onVehiculeUpdate',
VehiculeEvent::DELETED => 'onVehiculeDelete',
UserEvent::ANONYMISE => 'onUserAnonymise',
];
}
public function onUserAnonymise(UserEvent $event){
$user = $event->getUser();
// Log the event
$this->logger->info('ANONYMISATION', [
'mail' => $user->getEmail(),
'nom' => $user->getNom(),
'prenom' => $user->getPrenom(),
'roles' => $user->getRoles(),
'username' => $user->getUsername(),
]);
$this->eleve_cacher->delete($user);
// $user->
// Send an email
// $this->mailer->send((new TemplatedEmail())
// ->to(new Address($user->getEmail(), $user->getPrenom().' '.$user->getNom()))
// ->subject('Anonymisation de votre compte')
// ->htmlTemplate('mail/anonymisation.html.twig')
// ->context([
// 'user' => $user,
// ])
// );
}
public function onEleveCreditAdd(CreditEvent $event){
// Log the event
$this->logger->info('crédit ajouté', [
'User'=>$event->getEleve()->getUserIdentifier(),
'Categorie'=>$event->getCategorie()->getIntitule(),
'points'=>$event->getMovedPoints()
]);
$e = new \Exception;
$trace = print_r($e->getTraceAsString(),true);
$trace .= '#_GET '.print_r($_GET,true);
$trace .= '#_POST '.print_r($_POST,true);
$trace .= '#_SERVER '.print_r($_SERVER,true);
$trace .= '#Request '.print_r(Request::createFromGlobals()->getContent(),true);
$this->mailer->send((new TemplatedEmail())
->to('gabriel@pyreweb.com')
->subject('Points ajoutés')
->textTemplate('maildebug.txt.twig')
->context([
'texte'=>$event->getEleve()->getUserIdentifier().' a reçu '.$event->getMovedPoints().' points de la catégorie '.$event->getCategorie()->getIntitule().'.'.PHP_EOL.$trace,
])
);
$this->eleve_cacher->delete($event->getEleve());
}
public function onEleveDelete(EleveEvent $event)
{
$eleve = $event->getUser();
// Log the event
$this->logger->info('SUPPRESSION', [
'mail' => $eleve->getEmail(),
'nom' => $eleve->getNom(),
'prenom' => $eleve->getPrenom(),
]);
// Register the event in DB
$userEvent = new AppUserEvent();
$userEvent->setType('SUPPRESSION');
$userEvent->setMail($eleve->getEmail());
$userEvent->setNom($eleve->getNom());
$userEvent->setPrenom($eleve->getPrenom());
$this->eleve_cacher->delete($eleve);
}
public function onEleveCreate(EleveEvent $event)
{
$eleve = $event->getUser();
$this->eleve_cacher->delete($eleve);
}
public function onEleveUpdate(EleveEvent $event)
{
$eleve = $event->getUser();
$eleve->setUpdatedAt(new \DateTime('NOW'));
$this->entityManager->persist($eleve);
$this->entityManager->flush();
$this->eleve_cacher->delete($eleve);
}
public function onVehiculeUpdate(VehiculeEvent $event)
{
$vehicule = $event->getVehicule();
$this->vroum_cacher->delete($vehicule);
}
public function onVehiculeDelete(VehiculeEvent $event)
{
$vehicule = $event->getVehicule();
$this->vroum_cacher->delete($vehicule);
}
public function onVehiculeCreate(VehiculeEvent $event)
{
$prof = $event->getEnseignant();
$vehicule = $event->getVehicule();
$this->vroum_cacher->delete($vehicule);
$context = [
'user'=>$prof,
'vehicule'=>$vehicule,
];
try {
$dataV = [];
$dataV['id'] = $prof->getId();
$dataV['vehicule_immatriculation'] = $vehicule->getVehiculeImmatriculation();
if ($vehicule->getVehiculeAssurance()) {
$dataV['path'] = $vehicule->getVehiculeAssurance()->getPath();
$context['assurance'] = $this->router->generate('admin_vehicule_download_document', $dataV, UrlGeneratorInterface::ABSOLUTE_URL);
}
if ($vehicule->getVehiculeControle()) {
$dataV['path'] = $vehicule->getVehiculeControle()->getPath();
$context['controle'] = $this->router->generate('admin_vehicule_download_document', $dataV, UrlGeneratorInterface::ABSOLUTE_URL);
}
} catch (\Symfony\Component\Routing\Exception\InvalidParameterException $e) {
}
$this->mailer->send((new TemplatedEmail())
->subject('Véhicule ajouté')
->htmlTemplate('admin/mail/ajout_vehicule.html.twig')
->context($context));
}
public function onVehiculeEvaluate(VehiculeEvent $event){
$prof = $event->getEnseignant();
$vehicule = $event->getVehicule();
$this->vroum_cacher->delete($vehicule);
// Log the event
$this->logger->info('évaluation véhicule', [
'immatriculation' => $vehicule->getVehiculeImmatriculation(),
'nom' => $prof->getNom(),
'prenom' => $prof->getPrenom(),
'valid' => $vehicule->getValid(),
'invalid' => $vehicule->getInvalid(),
]);
$this->mailer->send((new TemplatedEmail())
->to($prof->getEMail())
->subject('Véhicule évalué')
->htmlTemplate('admin/mail/evaluation_vehicule.html.twig')
->context([
'user'=>$prof,
'vehicule'=>$vehicule,
]));
}
public function onEnseignantSuspend(EnseignantEvent $event)
{
$prof = $event->getUser();
// Log the event
$this->logger->info('DESACTIVATION', [
'mail' => $prof->getEmail(),
'nom' => $prof->getNom(),
'prenom' => $prof->getPrenom(),
]);
// Register the event in DB
$userEvent = new AppUserEvent();
$userEvent->setType('DESACTIVATION');
$userEvent->setMail($prof->getEmail());
$userEvent->setNom($prof->getNom());
$userEvent->setPrenom($prof->getPrenom());
$this->prof_cacher->delete($prof);
$objet = 'Compte suspendu';
$this->mailer->send((new TemplatedEmail())
->to($prof->getEMail())
->subject($objet)
->htmlTemplate('admin/mail/reactivation_prof.html.twig')
->context([
'user'=>$prof,
]));
}
public function onEnseignantUnsuspend(EnseignantEvent $event)
{
$prof = $event->getUser();
// Log the event
$this->logger->info('REACTIVATION', [
'mail' => $prof->getEmail(),
'nom' => $prof->getNom(),
'prenom' => $prof->getPrenom(),
]);
// Register the event in DB
$userEvent = new AppUserEvent();
$userEvent->setType('REACTIVATION');
$userEvent->setMail($prof->getEmail());
$userEvent->setNom($prof->getNom());
$userEvent->setPrenom($prof->getPrenom());
$this->prof_cacher->delete($prof);
$objet = 'Compte réactivé';
$this->mailer->send((new TemplatedEmail())
->to($prof->getEMail())
->subject($objet)
->htmlTemplate('admin/mail/desactivation_prof.html.twig')
->context([
'user'=>$prof,
]));
}
public function onEnseignantDelete(EnseignantEvent $event)
{
$prof = $event->getUser();
// Log the event
$this->logger->info('SUPPRESSION', [
'mail' => $prof->getEmail(),
'nom' => $prof->getNom(),
'prenom' => $prof->getPrenom(),
]);
// Register the event in DB
$userEvent = new AppUserEvent();
$userEvent->setType('SUPPRESSION');
$userEvent->setMail($prof->getEmail());
$userEvent->setNom($prof->getNom());
$userEvent->setPrenom($prof->getPrenom());
$this->prof_cacher->delete($prof);
$objet = 'Compte supprimé';
$this->mailer->send((new TemplatedEmail())
->to($prof->getEMail())
->subject($objet)
->htmlTemplate('admin/mail/suppression_prof.html.twig')
->context([
'user'=>$prof,
]));
}
public function onEnseignantCreate(EnseignantEvent $event)
{
$prof = $event->getUser();
$this->prof_cacher->delete($prof);
}
public function onEnseignantUpdate(EnseignantEvent $event)
{
$prof = $event->getUser();
$prof->setUpdatedAt(new \DateTime('NOW'));
$this->entityManager->persist($prof);
$this->entityManager->flush();
$this->prof_cacher->delete($prof);
}
public function onInscriptionFormateurNew(InscriptionFormateurEvent $event)
{
$prof = $event->getInscription();
// Delete the cache entries
$this->inscriptions_cacher->empty();
$this->lifecycle_cacher->empty();
// Log the event
$this->logger->info('INSCRIPTION', [
'mail' => $prof->getEmail(),
'nom' => $prof->getNom(),
'prenom' => $prof->getPrenom(),
]);
if (!$prof->getUserEnseignantAccountDetail()) {
$detail = new \App\Entity\UserEnseignantAccountDetail;
$prof->setUserEnseignantAccountDetail($detail);
$this->entityManager->persist($prof);
}
// Register the event in DB
$userEvent = new AppUserEvent();
$userEvent->setType('INSCRIPTION');
$userEvent->setMail($prof->getEmail());
$userEvent->setNom($prof->getNom());
$userEvent->setPrenom($prof->getPrenom());
$this->entityManager->persist($userEvent);
$this->entityManager->flush();
// Send Mail
}
public function onInscriptionEleveNew(InscriptionEleveEvent $event)
{
// Delete the cache entries
$this->lifecycle_cacher->empty();
$this->eleve_cacher->delete($event->getInscription());
$this->eleve_cacher->delete('count');
// Log the event
$this->logger->info('ELEVE', [
'mail' => $event->getInscription()->getEmail(),
'nom' => $event->getInscription()->getNom(),
'prenom' => $event->getInscription()->getPrenom(),
]);
// Register the event in DB
$userEvent = new AppUserEvent();
$userEvent->setType('ELEVE');
$userEvent->setMail($event->getInscription()->getEmail());
$userEvent->setNom($event->getInscription()->getNom());
$userEvent->setPrenom($event->getInscription()->getPrenom());
$this->entityManager->persist($userEvent);
$this->entityManager->flush();
}
public function onInscriptionEleveValidate(InscriptionEleveEvent $event)
{
$context = [];
$context['eleve'] = $event->getInscription();
$this->mailer->send((new TemplatedEmail())
->subject('Nouvelle inscription')
->htmlTemplate('admin/mail/new_eleve.html.twig')
->context($context));
}
public function onInscriptionFormateurValidate(InscriptionFormateurEvent $event)
{
$context = [];
$context['enseignant'] = $event->getInscription();
$this->mailer->send((new TemplatedEmail())
->subject('Nouvelle inscription')
->htmlTemplate('admin/mail/new_enseignant.html.twig')
->context($context));
$this->inscriptions_cacher->delete($event->getInscription());
$this->prof_cacher->delete($event->getInscription());
}
public function onInscriptionValidate(ValidationFormateurEvent $event)
{
// Delete the cache entries
$this->inscriptions_cacher->empty();
$this->prof_cacher->empty();
$this->lifecycle_cacher->empty();
// Log the event
$this->logger->info('VALIDATION', [
'mail' => $event->getValidation()->getEmail(),
'nom' => $event->getValidation()->getNom(),
'prenom' => $event->getValidation()->getPrenom(),
]);
// Register the event in DB
$userEvent = new AppUserEvent();
$userEvent->setType('VALIDATION');
$userEvent->setMail($event->getValidation()->getEmail());
$userEvent->setNom($event->getValidation()->getNom());
$userEvent->setPrenom($event->getValidation()->getPrenom());
$this->entityManager->persist($userEvent);
$this->entityManager->flush();
$context = [];
$context['user'] = $event->getValidation();
$this->mailer->send((new TemplatedEmail())
->to($event->getValidation()->getEMail())
->subject('Inscription validée')
->htmlTemplate('enseignant/mail/validation_inscription.html.twig')
->context($context));
}
}