src/Controller/ResetPasswordController.php line 25

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Event\SendVerificationEmailEvent;
  5. use App\Form\ForgotPasswordEmailType;
  6. use App\Form\ResetPasswordOtpType;
  7. use App\Form\ResetPasswordType;
  8. use App\Repository\UserRepository;
  9. use App\Security\CorporateUserAuthenticator;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  18. #[Route('/app/password')]
  19. class ResetPasswordController extends AbstractController
  20. {
  21.     #[Route('/forgot'name'app_password_forgot')]
  22.     public function forgot(Request $requestEventDispatcherInterface $eventDispatcherUserRepository $userRepository): Response
  23.     {
  24.         //@todo create a form to enter email id and generate otp and send to  email id if account exists, then redirect to otp page
  25.         $form $this->createForm(ForgotPasswordEmailType::class);
  26.         $form->handleRequest($request);
  27.         if ($form->isSubmitted() && $form->isValid()) {
  28.             $email $form->get('email')->getData();
  29.             $session $request->getSession();
  30.             $session->set('email'$email);
  31.             $user $userRepository->findUserByEmail($email);
  32.             if ($user) {
  33.                 $event = new SendVerificationEmailEvent($user'verifyOtp');
  34.                 $eventDispatcher->dispatch($eventSendVerificationEmailEvent::NAME);
  35.                 return $this->redirectToRoute('app_password_verify_otp');
  36.             }
  37.         }
  38.         return $this->render('reset_password/index.html.twig',[
  39.             'form' => $form
  40.         ]);
  41.     }
  42.     #[Route('/otp/verify'name'app_password_verify_otp')]
  43.     public function verifyOtp(Request $requestUserRepository $userRepository): Response
  44.     {
  45.         //@todo show a form to verify otp and validate
  46.         $form $this->createForm(ResetPasswordOtpType::class);
  47.         $form->handleRequest($request);
  48.         $email $request->getSession()->get('email');
  49.         if ($form->isSubmitted() && $form->isValid()) {
  50.             $user $userRepository->findUserByEmail($request->getSession()->get('email'));
  51.             $resetOtp $form->get('otp')->getData();
  52.             if ($user->getResetPasswordOtp() == $resetOtp) {
  53.                 return $this->redirectToRoute('app_password_reset');
  54.             } else {
  55.                 return $this->redirectToRoute('app_password_verify_otp');
  56.             }
  57.         }
  58.         return $this->render('reset_password/verifyOtp.html.twig',[
  59.             'form' => $form,
  60.             'email' => $email
  61.         ]);
  62.     }
  63.     #[Route('/reset'name'app_password_reset')]
  64.     public function reset(Request $requestUserPasswordHasherInterface $userPasswordHasher,
  65.                           EntityManagerInterface $entityManagerUserRepository $userRepository): Response
  66.     {
  67.         //@todo show a form to reset password
  68.         $form $this->createForm(ResetPasswordType::class);
  69.         $form->handleRequest($request);
  70.         if ($form->isSubmitted() && $form->isValid()) {
  71.             if ($form->get('password')->getData() == $form->get('confirmPassword')->getData()) {
  72.                 $user $userRepository->findUserByEmail($request->getSession()->get('email'));
  73.                 $user->setPassword(
  74.                     $userPasswordHasher->hashPassword($user$form->get('password')->getData())
  75.                 );
  76.                 $entityManager->persist($user);
  77.                 $entityManager->flush();
  78.                 return $this->redirectToRoute('app_login');
  79.             }
  80.         }
  81.         return $this->render('reset_password/resetPassword.html.twig', [
  82.             'form' => $form
  83.         ]);
  84.     }
  85.     #[Route('/otp/verify/resend'name'app_password_verify_otp_resend')]
  86.     public function resendVerifyOtp(Request $requestUserRepository $userRepositoryEventDispatcherInterface $eventDispatcher) {
  87.         $user $userRepository->findUserByEmail($request->getSession()->get('email'));
  88.         if ($user) {
  89.             $event = new SendVerificationEmailEvent($user'verifyOtp');
  90.             $eventDispatcher->dispatch($eventSendVerificationEmailEvent::NAME);
  91.         }
  92.         return $this->redirectToRoute('app_password_verify_otp');
  93.     }
  94. }