src/Controller/UserController.php line 297

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\DTO\ChangeEmailDTO;
  4. use App\DTO\ChangePhoneDTO;
  5. use App\Email\DefaultTemplatedEmail;
  6. use App\Entity\ComplaintX;
  7. use App\Entity\User;
  8. use App\Form\ChangeEmailType;
  9. use App\Form\ChangePhoneType;
  10. use App\Form\DeleteAccountType;
  11. use App\Form\SettingsAccountType;
  12. use App\Service\TokenGenerator;
  13. use App\Service\UserService;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  20. use Symfony\Component\Mailer\MailerInterface;
  21. use Symfony\Component\Mime\Address;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. /**
  25.  * Require ROLE_INCOMPLETE_USER for *every* controller method in this class.
  26.  *
  27.  * @IsGranted("ROLE_INCOMPLETE_USER")
  28.  */
  29. class UserController extends AbstractController
  30. {
  31.     /**
  32.      * @Route("/user/information", name="user_information")
  33.      */
  34.     public function informationAction(Request $request)
  35.     {
  36.         $isFirstTime true;
  37.         if (null !== $this->getUser()->getBirthDate()) {
  38.             $isFirstTime false;
  39.         }
  40.         return $this->render('User/myInformation.html.twig', [
  41.             'isFirstTime' => $isFirstTime
  42.         ]);
  43.     }
  44.     /**
  45.      * @Route("/user/phone", name="user_phone")
  46.      */
  47.     public function phoneAction(Request $request)
  48.     {
  49.         return $this->render('User/phone.html.twig');
  50.     }
  51.     /**
  52.      * @Route("/user/phone-change", name="user_change_phone")
  53.      */
  54.     public function changePhoneAction(Request $request)
  55.     {
  56.         $user $this->getUser();
  57.         $changePhoneDTO = new ChangePhoneDTO($user);
  58.         $em $this->getDoctrine()->getManager();
  59.         $contactInfosForm $this->createForm(ChangePhoneType::class, $changePhoneDTO);
  60.         $contactInfosForm->handleRequest($request);
  61.         if ($contactInfosForm->isSubmitted() && $contactInfosForm->isValid()) {
  62.             if ($changePhoneDTO->getSMSCode() === $user->getPhoneNumberConfirmationCode()) {
  63.                 $user->setPhoneNumber($changePhoneDTO->getPhone());
  64.                 $em->flush();
  65.                 $this->addFlash(
  66.                     "success",
  67.                     'Votre nouveau numéro ' $changePhoneDTO->getPhone() . ' a bien été pris en compte'
  68.                 );
  69.                 return $this->redirectToRoute('user_settings_profile');
  70.             } else {
  71.                 $this->addFlash("danger"'Le code sms est erroné');
  72.                 return $this->redirectToRoute('user_change_phone');
  73.             }
  74.         }
  75.         $user->setPhoneNumberConfirmationCode(rand(1111199999));
  76.         $em->flush();
  77.         return $this->render('User/changePhone.html.twig', [
  78.             'changePhoneForm' => $contactInfosForm->createView(),
  79.         ]);
  80.     }
  81.     /**
  82.      * @Route("/user/confirmer-nouvel-email/{token}", name="confirm_email_change")
  83.      */
  84.     public function confirmEmailChange($token)
  85.     {
  86.         // Find a user with this validationToken.
  87.         $user $this->getDoctrine()->getRepository(User::class)->findOneByValidationToken($token);
  88.         // We found a matching user, then set the new email as primary email
  89.         if (null !== $user) {
  90.             $user
  91.                 ->setEmail($user->getPendingNewEmail())
  92.                 ->setPendingNewEmail(null)
  93.                 ->setValidationToken(null);
  94.             $em $this->getDoctrine()->getManager();
  95.             $em->persist($user);
  96.             $em->flush();
  97.         }
  98.         else
  99.         {
  100.             $this->addFlash("danger""Ce lien de validation d'email n'est pas valide.");
  101.         }
  102.         return $this->redirectToRoute("user_settings_profile");
  103.     }
  104.     /**
  105.      * @Route("/user/email", name="user_email")
  106.      */
  107.     public function emailAction(Request $request)
  108.     {
  109.         return $this->render('User/email.html.twig');
  110.     }
  111.     /**
  112.      * @Route("/user/email-change", name="user_change_email")
  113.      */
  114.     public function changeEmailAction(Request $requestTokenGenerator $tokenGeneratorMailerInterface $mailer)
  115.     {
  116.         $user $this->getUser();
  117.         $changeEmailDTO = new ChangeEmailDTO($user);
  118.         $changeEmailForm $this->createForm(ChangeEmailType::class, $changeEmailDTO);
  119.         $changeEmailForm->handleRequest($request);
  120.         $em $this->getDoctrine()->getManager();
  121.         // On form submission
  122.         if ($changeEmailForm->isSubmitted() && $changeEmailForm->isValid()) {
  123.             $emailAlreadyUsed $this->getDoctrine()->getRepository(User::class)->findOneByEmail($changeEmailDTO->getEmail());
  124.             if (null !== $emailAlreadyUsed) {
  125.                 $this->addFlash("danger"'L\'adresse email ' $changeEmailDTO->getEmail() . ' est déjà utilisée.');
  126.                 return $this->redirectToRoute('user_change_email');
  127.             }
  128.             // $user->setEmail($changeEmailDTO->getEmail());
  129.             $user
  130.                 ->setPendingNewEmail($changeEmailDTO->getEmail())
  131.                 ->setValidationToken($tokenGenerator->generate());
  132.             $em $this->getDoctrine()->getManager();
  133.             $em->flush();
  134.             // Send a mail with a validation link generated w/ a token
  135.             $messageMail = (new DefaultTemplatedEmail())
  136.                 ->to($user->getPendingNewEmail())
  137.                 ->subject("Validation de votre nouvelle adresse Email")
  138.                 ->htmlTemplate('Mail/changeEmail.html.twig');
  139.             $mailer->send($messageMail);
  140.             $this->addFlash(
  141.                 "success",
  142.                 'Votre nouvelle adresse email ' $changeEmailDTO->getEmail() . ' a bien été pris en compte, pensez à la valider en suivant le lien envoyé par mail'
  143.             );
  144.             return $this->render('User/email.html.twig');
  145.         }
  146.         $em->flush();
  147.         return $this->render('User/changeEmail.html.twig', [
  148.             'changeEmailForm' => $changeEmailForm->createView(),
  149.         ]);
  150.     }
  151.     /**
  152.      * @Route("/user/delete/account/send", name="user_delete_account_send")
  153.      */
  154.     public function deleteAccountSendAction(UserService $srvUserTokenStorageInterface $tokenStorageRequest $requestMailerInterface $mailer)
  155.     {
  156.         /* @var $user User */
  157.         $user $this->getUser();
  158.         //TODO Remove this part before setting live
  159.         //$srvUser->delete($user);
  160.         //$request->getSession()->invalidate();
  161.         //$tokenStorage->setToken(); // TokenStorageInterface
  162.         //return $this->redirectToRoute('homepage');
  163.         $em $this->getDoctrine()->getManager();
  164.         $deleteCode mt_rand(100000999999);
  165.         $user->setDeleteCode($deleteCode);
  166.         $em->flush();
  167.         $email = (new DefaultTemplatedEmail())
  168.             ->to(new Address($user->getEmail()))
  169.             ->subject('Demande de suppression de compte Riposte')
  170.             // path of the Twig template to render
  171.             ->htmlTemplate('Mail/deleteAccount.html.twig')
  172.             // pass variables (name => value) to the template
  173.             ->context(['deleteCode' => $deleteCode,]);
  174.         try {
  175.             $mailer->send($email);
  176.             $this->addFlash(
  177.                 "success_delete",
  178.                 'Votre demande de clôture de compte a bien été enregistrée, et un email vous a été adressé pour vous permettre de finaliser cette procédure.'
  179.             );
  180.             return $this->redirectToRoute('user_settings_account');
  181.         } catch (TransportExceptionInterface $e) {
  182.             $this->addFlash('warning''Une erreur est survenue lors de l\'envoi du message.');
  183.             return $this->redirectToRoute('user_settings_account');
  184.         }
  185.     }
  186.     /**
  187.      * @Route("/user/delete/account/confirmation", name="user_delete_account_confirm")
  188.      */
  189.     public function deleteAccountConfirmationAction(UserService $srvUserRequest $requestTokenStorageInterface $tokenStorage null)
  190.     {
  191.         /* @var $user User */
  192.         $user $this->getUser();
  193.         $deleteCode $user->getDeleteCode();
  194.         $deleteAccountForm $this->createForm(DeleteAccountType::class);
  195.         $deleteAccountForm->handleRequest($request);
  196.         if ($deleteAccountForm->isSubmitted() && $deleteAccountForm->isValid()) {
  197.             $codeArray str_split($deleteCode);
  198.             $codeFormArray = [
  199.                 $deleteAccountForm->get('code1')->getData(),
  200.                 $deleteAccountForm->get('code2')->getData(),
  201.                 $deleteAccountForm->get('code3')->getData(),
  202.                 $deleteAccountForm->get('code4')->getData(),
  203.                 $deleteAccountForm->get('code5')->getData(),
  204.                 $deleteAccountForm->get('code6')->getData()
  205.             ];
  206.             if (($codeArray === $codeFormArray)) {
  207.                 $srvUser->delete($user);
  208.                 $request->getSession()->invalidate();
  209.                 $tokenStorage->setToken();
  210.                 return $this->redirect($this->getParameter('portal_url'));
  211.             } else {
  212.                 $this->addFlash("warning"'Code invalide');
  213.                 return $this->redirectToRoute('user_delete_account_confirm');
  214.             }
  215.         }
  216.         return $this->render('User/deleteAccountConfirmation.html.twig', [
  217.             'deleteAccountForm' => $deleteAccountForm->createView(),
  218.         ]);
  219.     }
  220.     /**
  221.      * @Route("/user/parametres", name="user_settings_account")
  222.      */
  223.     public function settingsAction(Request $requestEntityManagerInterface $manager): Response
  224.     {
  225.         $user $this->getUser();
  226.         $settingsAccountForm $this->createForm(SettingsAccountType::class, $user);
  227.         $settingsAccountForm->handleRequest($request);
  228.         if ($settingsAccountForm->isSubmitted()) {
  229.             $manager->flush();
  230.             return $this->redirectToRoute('user_settings_account');
  231.         }
  232.         return $this->render('User/settings.html.twig', [
  233.             'settingsAccountForm' => $settingsAccountForm->createView(),
  234.         ]);
  235.     }
  236.     #[Route('/user/parameters/profile'name'user_settings_profile')]
  237.     public function settingsProfileAction(Request $request): Response
  238.     {
  239.         return $this->render('User/settings_profile.html.twig');
  240.     }
  241.     #[Route('/user/parameters/legal-info'name'user_settings_legal_info')]
  242.     public function settingsLegalInfoAction(Request $request): Response
  243.     {
  244.         return $this->render('User/settings_legal_info.html.twig');
  245.     }
  246.     #[Route('/user'name'user_homepage')]
  247.     public function homepageAction(): Response
  248.     {
  249.         $complaintXRepository $this->getDoctrine()->getRepository(ComplaintX::class);
  250.         $complaints $complaintXRepository->findLast($this->getUser(), 10);
  251.         return $this->render('User/homepage.html.twig', ['complaints' => $complaints]);
  252.     }
  253. }