src/Controller/User/PasswordResetController.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Controller\User;
  3. use App\Entity\PasswordReset;
  4. use App\Entity\User;
  5. use App\Form\NewPasswordType;
  6. use App\Form\PasswordResetType;
  7. use App\Repository\PasswordResetRepository;
  8. use App\Repository\UserRepository;
  9. use App\Service\PasswordResetService;
  10. use Doctrine\ORM\Id\UuidGenerator;
  11. use SendGrid;
  12. use SendGrid\Mail\Mail;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  18. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  19. class PasswordResetController extends AbstractController
  20. {
  21.     /**
  22.      * @Route("/login/password/reset", name="password_reset")
  23.      */
  24.     public function index(Request $request, UserRepository $userRepository, PasswordResetService $passwordResetService, SessionInterface $sessionInterface)
  25.     {
  26.         if($this->getUser() !== null){
  27.             return $this->redirectToRoute("app_login");
  28.         }
  29.         $form = $this->createForm(PasswordResetType::class);
  30.         $form->handleRequest($request);
  31.         $error = null;
  32.         if($form->isSubmitted()){
  33.             $email = $form->get('email')->getData();
  34.             $user = $userRepository->findOneBy(['email' => $email]);
  35.             $message = $this->render('user/password_reset/_email.html.twig')->getContent();
  36.             
  37.             if($user instanceof User){
  38.                 
  39.                 $em = $this->getDoctrine()->getManager();
  40.                 
  41.                 $passwordReset = new PasswordReset();
  42.                 
  43.                 $uuid = new UuidGenerator();
  44.                 $uuid = $uuid->generate($em, $passwordReset);
  45.                 
  46.                 $passwordReset->setEmail($email);
  47.                 $passwordReset->setToken($uuid);
  48.                 $em->persist($passwordReset);
  49.                 $em->flush();
  50.                 
  51.                 $link = $passwordResetService->createLink($passwordReset->getToken());
  52.                 $message = str_replace('%password_reset_link%', $link, $message);
  53.                 $sendgrid_mail = new Mail();
  54.                 $sendgrid_mail->setFrom('noreply@smilemood.fr', 'Smile Mood'); 
  55.                 $sendgrid_mail->setSubject("Réinitialisation de mot de passe Smile Mood");
  56.                 $sendgrid_mail->addTo($email);
  57.                 $sendgrid_mail->addContent("text/html", $message);
  58.                 $sendgrid = new SendGrid($this->getParameter('sendgrid_api_key'));
  59.                 $response = $sendgrid->send($sendgrid_mail);
  60.                 dd($response);
  61.                 $route = $request->get('_route');
  62.                 $sessionInterface->set('password_reset_route', $route);
  63.                 $this->addFlash("success", "Si l'adresse email est valide, vous recevrez un lien pour changer votre mot de passe.");
  64.                 return $this->redirectToRoute("password_reset_email_sent");
  65.             }else{
  66.                 $error = "L'adresse email que vous avez saisi est introuvable.";
  67.             }
  68.         }
  69.         return $this->render('user/password_reset/index.html.twig', [
  70.             'form' => $form->createView(),
  71.             'error' => $error
  72.         ]);
  73.     }
  74.     /**
  75.      * Undocumented function
  76.      *
  77.      * @return void
  78.      * 
  79.      * @Route("/login/password/change", name="password_reset_change")
  80.      */
  81.     public function changePassword(Request $request, PasswordResetRepository $passwordResetRepository, UserRepository $userRepository, UserPasswordEncoderInterface $encoder){
  82.         $access = $request->query->get('access');
  83.         $em = $this->getDoctrine()->getManager();
  84.         $passwordReset = $passwordResetRepository->findOneBy([
  85.             'token' => $access
  86.         ], [
  87.             'created_at' => 'DESC'
  88.         ]);
  89.         $error = null;
  90.         if($passwordReset instanceof PasswordReset){
  91.             $email = $passwordReset->getEmail();
  92.         }else{
  93.             $error = "Ce code d'accès n'est plus valide.";
  94.         }
  95.         $form = $this->createForm(NewPasswordType::class);
  96.         $form->handleRequest($request);
  97.         if($form->isSubmitted() && $form->isValid()){
  98.             $allPasswordReset = $passwordResetRepository->findBy(['email' => $email]);
  99.             $newPassword = $form->get('password')->getData();
  100.             $user = $userRepository->findOneBy(['email' => $email]);
  101.             $user->setPassword($encoder->encodePassword($user, $newPassword));
  102.             $em->persist($user);
  103.             foreach ($allPasswordReset as $reset) {
  104.                 $em->remove($reset);
  105.             }
  106.             $em->flush();
  107.             $this->addFlash("success", "Votre mot de passe a été changé avec succès. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe. ");
  108.             return $this->redirectToRoute("app_login");
  109.         }
  110.         
  111.         return $this->render("user/password_reset/new.password.html.twig", [
  112.             'form' => $form->createView(),
  113.             'error' => $error
  114.         ]);
  115.     }
  116.     /**
  117.      * @Route("/login/password/reset/sent", name="password_reset_email_sent")
  118.      */
  119.     public function passwordResetEmailSent(Request $request, SessionInterface $sessionInterface){
  120.         $previousRoute = $sessionInterface->get('password_reset_route');
  121.         if(!empty($previousRoute)){
  122.             if($previousRoute !== "password_reset"){
  123.                 return $this->redirectToRoute("app_login");
  124.             }
  125.         }else{
  126.             return $this->redirectToRoute("app_login");
  127.         }
  128.         $sessionInterface->remove('password_reset_route');
  129.         return $this->render("user/password_reset/sent.html.twig");
  130.     }
  131. }