<?php
namespace App\Controller\User;
use App\Entity\PasswordReset;
use App\Entity\User;
use App\Form\NewPasswordType;
use App\Form\PasswordResetType;
use App\Repository\PasswordResetRepository;
use App\Repository\UserRepository;
use App\Service\PasswordResetService;
use Doctrine\ORM\Id\UuidGenerator;
use SendGrid;
use SendGrid\Mail\Mail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class PasswordResetController extends AbstractController
{
/**
* @Route("/login/password/reset", name="password_reset")
*/
public function index(Request $request, UserRepository $userRepository, PasswordResetService $passwordResetService, SessionInterface $sessionInterface)
{
if($this->getUser() !== null){
return $this->redirectToRoute("app_login");
}
$form = $this->createForm(PasswordResetType::class);
$form->handleRequest($request);
$error = null;
if($form->isSubmitted()){
$email = $form->get('email')->getData();
$user = $userRepository->findOneBy(['email' => $email]);
$message = $this->render('user/password_reset/_email.html.twig')->getContent();
if($user instanceof User){
$em = $this->getDoctrine()->getManager();
$passwordReset = new PasswordReset();
$uuid = new UuidGenerator();
$uuid = $uuid->generate($em, $passwordReset);
$passwordReset->setEmail($email);
$passwordReset->setToken($uuid);
$em->persist($passwordReset);
$em->flush();
$link = $passwordResetService->createLink($passwordReset->getToken());
$message = str_replace('%password_reset_link%', $link, $message);
$sendgrid_mail = new Mail();
$sendgrid_mail->setFrom('noreply@smilemood.fr', 'Smile Mood');
$sendgrid_mail->setSubject("Réinitialisation de mot de passe Smile Mood");
$sendgrid_mail->addTo($email);
$sendgrid_mail->addContent("text/html", $message);
$sendgrid = new SendGrid($this->getParameter('sendgrid_api_key'));
$response = $sendgrid->send($sendgrid_mail);
dd($response);
$route = $request->get('_route');
$sessionInterface->set('password_reset_route', $route);
$this->addFlash("success", "Si l'adresse email est valide, vous recevrez un lien pour changer votre mot de passe.");
return $this->redirectToRoute("password_reset_email_sent");
}else{
$error = "L'adresse email que vous avez saisi est introuvable.";
}
}
return $this->render('user/password_reset/index.html.twig', [
'form' => $form->createView(),
'error' => $error
]);
}
/**
* Undocumented function
*
* @return void
*
* @Route("/login/password/change", name="password_reset_change")
*/
public function changePassword(Request $request, PasswordResetRepository $passwordResetRepository, UserRepository $userRepository, UserPasswordEncoderInterface $encoder){
$access = $request->query->get('access');
$em = $this->getDoctrine()->getManager();
$passwordReset = $passwordResetRepository->findOneBy([
'token' => $access
], [
'created_at' => 'DESC'
]);
$error = null;
if($passwordReset instanceof PasswordReset){
$email = $passwordReset->getEmail();
}else{
$error = "Ce code d'accès n'est plus valide.";
}
$form = $this->createForm(NewPasswordType::class);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$allPasswordReset = $passwordResetRepository->findBy(['email' => $email]);
$newPassword = $form->get('password')->getData();
$user = $userRepository->findOneBy(['email' => $email]);
$user->setPassword($encoder->encodePassword($user, $newPassword));
$em->persist($user);
foreach ($allPasswordReset as $reset) {
$em->remove($reset);
}
$em->flush();
$this->addFlash("success", "Votre mot de passe a été changé avec succès. Vous pouvez maintenant vous connecter avec votre nouveau mot de passe. ");
return $this->redirectToRoute("app_login");
}
return $this->render("user/password_reset/new.password.html.twig", [
'form' => $form->createView(),
'error' => $error
]);
}
/**
* @Route("/login/password/reset/sent", name="password_reset_email_sent")
*/
public function passwordResetEmailSent(Request $request, SessionInterface $sessionInterface){
$previousRoute = $sessionInterface->get('password_reset_route');
if(!empty($previousRoute)){
if($previousRoute !== "password_reset"){
return $this->redirectToRoute("app_login");
}
}else{
return $this->redirectToRoute("app_login");
}
$sessionInterface->remove('password_reset_route');
return $this->render("user/password_reset/sent.html.twig");
}
}