<?php
namespace App\Controller\Admin;
use App\Entity\Commun\Utilisateur;
use App\Entity\Parametrage\EnumParametre;
use App\Entity\Parametrage\EnumTypeNotification;
use App\Form\Commun\DefinitionMotDePasseType;
use App\Service\Commun\MailService;
use App\Service\Commun\UtilisateurService;
use App\Service\Notification\NotificationService;
use App\Service\Parametrage\ParametrageService;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class ActivationCompteController extends AbstractController
{
private $parametrageService;
private $notificationService;
public function __construct(ParametrageService $parametrageService, NotificationService $notificationService)
{
$this->parametrageService = $parametrageService;
$this->notificationService = $notificationService;
}
/**
* Envoi du code d'activation du compte
* TODO avoir un template mail différent pour renvoyer le lien d'activation ou réinitialiser le mdp
*
* @Route("/renvoyer-code", name="compte_renvoyer_code_activation")
*/
public function renvoyerCodeActivation(Request $request, UtilisateurService $utilisateurService, LoggerInterface $logger)
{
// TODO validation format email
$form = $this->createForm(EmailType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->getData();
$repo = $this->getDoctrine()->getManager()->getRepository(Utilisateur::class);
$user = $repo->loadUserByUsername($email);
if ($user) {
$resultatMail = $utilisateurService->envoyerCodeActivation($user);
if (!$resultatMail["sent"]) {
return $this->render('admin/activation_compte/renvoyer_code.html.twig', [
'form' => $form->createView(),
'error' => "Echec de l'envoi du code d'activation. Veuillez réessayer ultérieurement."
]);
}
}
// Sinon, l'email n'existe pas en base, mais on le masque à l'utilisateur
$logger->info("Demande activation de compte ignoree : utilisateur inexistant", ['email' => $email]);
$mailContactNumeroVert = $this->parametrageService->getParametre(EnumParametre::MAIL_CONTACT_NUMEROVERT)->getValeur();
return $this->render('admin/activation_compte/envoi_code_confirmation.html.twig', [
'form' => $form->createView(),
'mailContactNumeroVert' => $mailContactNumeroVert
]);
}
return $this->render('admin/activation_compte/renvoyer_code.html.twig', ['form' => $form->createView()]);
}
/**
* TODO DOC
*
* @Route("/reinitialiser-mot-de-passe", name="compte_demander_reinitialisation_mot_de_passe")
*/
public function demanderReinitialisationMotDePasse(Request $request, UtilisateurService $utilisateurService, LoggerInterface $logger)
{
// TODO validation format email
$form = $this->createForm(EmailType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->getData();
$logger->debug("Traitement de la demande de réinitialisation de mot de passe pour le mail $email");
$repo = $this->getDoctrine()->getManager()->getRepository(Utilisateur::class);
$user = $repo->loadUserByUsername($email);
if ($user) {
$logger->debug("L'utilisateur associé à l'email $email a été trouvé");
$resultatMail = $utilisateurService->demanderReinitialisationMotDePasse($user);
if (!$resultatMail["sent"]) {
$logger->debug("Erreur lors de l'envoi du mail de réinitialisation du mot de passe à l'utilisateur $email");
return $this->render('admin/activation_compte/renvoyer_code.html.twig', [
'form' => $form->createView(),
'error' => "Echec de l'envoi du code. Veuillez réessayer ultérieurement.",
]);
}
$logger->debug("Le code de réinitialisation du mot de passe a été envoyé à l'utilisateur $email");
}
else {
// Sinon, l'email n'existe pas en base, mais on le masque à l'utilisateur
$logger->info("Demande de réinitialisation de mot de passe ignorée : utilisateur inexistant", ['email' => $email]);
}
$mailContactNumeroVert = $this->parametrageService->getParametre(EnumParametre::MAIL_CONTACT_NUMEROVERT)->getValeur();
return $this->render('admin/reinitialisation_mot_de_passe/reinitialiser_confirmation.html.twig', [
'form' => $form->createView(),
'mailContactNumeroVert' => $mailContactNumeroVert
]);
}
return $this->render('admin/reinitialisation_mot_de_passe/demander_reinitialisation.html.twig', ['form' => $form->createView()]);
}
/**
* TODO DOC
*
* @Route("/definir-mot-de-passe", name="compte_definir_mot_de_passe")
*/
public function definirMotDePasse(Request $request, UtilisateurService $utilisateurService, UserPasswordEncoderInterface $passwordEncoder, MailService $mailService)
{
$code = $request->query->get('code');
$email = $request->query->get('email');
if (!$email || !$code) {
// TODO avoir une interface qui permet d'activer à la main ?
return $this->render('commun/erreurs/erreur_generique.html.twig', ['message' => "Le lien d'activation de compte est incomplet.\n Veuillez copier le lien depuis l'email d'activation reçu."]);
}
if (!$utilisateurService->verifierCodeActivation($code, $email)) {
// Affichage user-friendly
return $this->render('commun/erreurs/erreur_generique.html.twig', ['message' => "Lien d'activation invalide, déjà utilisé ou périmé."]);
}
// Formulaire permettant de définir son mot de passe
$form = $this->createForm(DefinitionMotDePasseType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// On vérifie de nouveau la validité du code (il peut s'écouler du temps entre l'affichage et l'envoi du formulaire...)
if (!$utilisateurService->verifierCodeActivation($code, $email)) {
// Affichage user-friendly
return $this->render('commun/erreurs/erreur_generique.html.twig', ['message' => "Lien d'activation invalide, déjà utilisé ou périmé."]);
}
// Enregistrer le nouveau mot de passe
// TODO service
// TODO duplication avec MonCompteController
// TODO règles nouveau mot de passe
$repo = $this->getDoctrine()->getManager()->getRepository(Utilisateur::class);
$user = $repo->loadUserByUsername($email);
// Le compte est-il déjà activé ?
$mdp_existe = $user->getPassword() ? true : false;
$utilisateurService->enregistrerMotDePasse($user, $form->get('password')->getData());
if ($mdp_existe) {
// Le mot de passe a été modifié
$resultatMail = $mailService->envoyerInfoChangementMotDePasse($user);
if (!$resultatMail["sent"]) {
return $this->render('commun/erreurs/erreur_generique.html.twig', ['message' => "Le lien d'activation n'a pas pu être envoyé, veuillez réessayer ultérieurement."]);
}
} else {
// Le compte a été activé
//notification d'activation à faire
if ($user->estAssistantMaternel()) {
$this->notificationService->ajouterOuMettreAJourNotification($user->getAssistantMaternel()->getId(), EnumTypeNotification::ACTIVATION_COMPTE, '', '');
} else {
//initialise les préférences selon le profil
$utilisateurService->gererPreferencesNotification($user, 0, $user->getProfil()->getId());
}
}
return $this->render('admin/definir_mot_de_passe/definir_mot_de_passe_confirmation.html.twig', ['form' => $form->createView()]);
}
return $this->render('admin/definir_mot_de_passe/definir_mot_de_passe.html.twig', ['form' => $form->createView()]);
}
}