src/Controller/UserController.php line 68

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Builder\MailerBuilder;
  4. use App\Entity\User;
  5. use App\Form\User\ForgotPasswordType;
  6. use App\Form\User\ResetPasswordType;
  7. use App\Form\User\UpdatePasswordType;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. class UserController extends AbstractController
  17. {
  18.     private EntityManagerInterface $entityManager;
  19.     private TranslatorInterface $translator;
  20.     private UserPasswordHasherInterface $passwordEncoder;
  21.     private MailerBuilder $mailerBuilder;
  22.     public function __construct(TranslatorInterface $translatorEntityManagerInterface $entityManagerUserPasswordHasherInterface $passwordEncoderMailerBuilder $mailerBuilder)
  23.     {
  24.         $this->entityManager $entityManager;
  25.         $this->translator $translator;
  26.         $this->passwordEncoder $passwordEncoder;
  27.         $this->mailerBuilder $mailerBuilder;
  28.     }
  29.     /**
  30.      * @Route("/user/password", name="updatePassword")
  31.      */
  32.     public function updatePassword(Request $request): Response
  33.     {
  34.         if (!$this->getUser()->getIsNew()) {
  35.             return $this->redirectToRoute('home');
  36.         }
  37.         $userForm = new User();
  38.         $user $this->getUser();
  39.         $userForm->setEmail($user->getEmail());
  40.         $formUser $this->createForm(UpdatePasswordType::class, $userForm)->handleRequest($request);
  41.         if ($formUser->isSubmitted() && $formUser->isValid()) {
  42.             $password $userForm->getPassword();
  43.             $user->setLastname($userForm->getLastname());
  44.             $user->setFirstname($userForm->getFirstname());
  45.             if (preg_match("#^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[-+!*$@%_])([-+!*$@%_\w]{8,15})$#"$password)) {
  46.                 $user->setPassword($this->passwordEncoder->hashPassword($user$password));
  47.                 $user->setIsNew(false);
  48.                 $this->entityManager->flush();
  49.                 return $this->redirectToRoute('home');
  50.             } else {
  51.                 $this->addFlash('error'$this->translator->trans("user.updatePassword.mdp"));
  52.             }
  53.         }
  54.         return $this->render('user/updatePassword.html.twig', [
  55.             'formUser' => $formUser->createView(),
  56.         ]);
  57.     }
  58.     /**
  59.      * @Route("/user/forgotPassword", name="forgotPassword")
  60.      */
  61.     public function forgotPassword(Request $request): Response
  62.     {
  63.         if ($this->getUser()) {
  64.             return $this->redirectToRoute('home');
  65.         }
  66.         $hashRequest $request->query->get('hash');
  67.         if ($hashRequest) {
  68.             $user $this->entityManager->getRepository(User::class)->findOneBy(['passwordRequest' => $hashRequest]);
  69.             if ($user) {
  70.                 $formForgotPassword $this->createForm(ResetPasswordType::class)->handleRequest($request);
  71.                 if ($formForgotPassword->isSubmitted() && $formForgotPassword->isValid()) {
  72.                     $password $formForgotPassword->getData()['password'];
  73.                     if (preg_match("#^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[-+!*$@%_])([-+!*$@%_\w]{8,15})$#"$password)) {
  74.                         $user->setPassword($this->passwordEncoder->hashPassword($user$password));
  75.                         $user->setPasswordRequest(null);
  76.                         $this->entityManager->flush();
  77.                         $this->addFlash('success'"Votre mot passe vient d'être modifié !");
  78.                         return $this->redirectToRoute('login');
  79.                     } else {
  80.                         $this->addFlash('error'"Le mot de passe doit au moins contenir de 8 à 15 caractères, une lettre majuscule et minuscule, au moins un chiffre et au moins un de ces caractères spéciaux: $ @ % * + - _ !");
  81.                         return $this->redirectToRoute('forgotPassword', ['hash' => $hashRequest]);
  82.                     }
  83.                 }
  84.             } else {
  85.                 return $this->redirectToRoute('login');
  86.             }
  87.         } else {
  88.             $formForgotPassword $this->createForm(ForgotPasswordType::class)->handleRequest($request);
  89.             if ($formForgotPassword->isSubmitted() && $formForgotPassword->isValid()) {
  90.                 $email $formForgotPassword->getData()['email'];
  91.                 $user $this->entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  92.                 if ($user) {
  93.                     $hash hash('SHA256'$user->getEmail() . rand(05000));
  94.                     $user->setPasswordRequest($hash);
  95.                     $this->entityManager->flush();
  96.                     $this->mailerBuilder->mailForgotPassword($user$hash);
  97.                     $this->addFlash('success'"Un e-mail contenant un lien de changement de mot de passe vient d'être envoyé !");
  98.                 } else {
  99.                     $this->addFlash('error'"Aucun utilisateur ne correspond à cette adresse e-mail.");
  100.                 }
  101.                 return $this->redirectToRoute('forgotPassword');
  102.             }
  103.         }
  104.         return $this->render('user/forgotPassword.html.twig', [
  105.             'formForgotPassword' => $formForgotPassword->createView(),
  106.         ]);
  107.     }
  108.     /**
  109.      * @Route("/adminApi/connect", name="connectApi")
  110.      */
  111.     public function connectApi(): JsonResponse
  112.     {
  113.         return $this->json(['code' => 200"ok"], 200);
  114.     }
  115.     /**
  116.      * AJAX
  117.      * @Route("/user/request", name="requestUser")
  118.      */
  119.     public function requestUser(Request $request): JsonResponse
  120.     {
  121.         $informations = [];
  122.         $informations['lastname'] = $request->query->get('lastname');
  123.         $informations['firstname'] = $request->query->get('firstname');
  124.         $informations['company'] = $request->query->get('company');
  125.         $informations['vat'] = $request->query->get('vat');
  126.         $informations['email'] = $request->query->get('email');
  127.         $informations['phone'] = $request->query->get('phone');
  128.         return $this->json($this->mailerBuilder->mailRequestUser($informations));;
  129.     }
  130. }