src/Controller/Transporteur/RegisterController.php line 158

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Transporteur;
  3. use App\Entity\{TransporteurUser};
  4. use App\Form\{TransporteurTypeResendConfirmationType};
  5. use App\Service\{AccessClientServiceAddressInfoService};
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  12. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  13. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  14. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  15. use DateTime;
  16. use Symfony\Component\Mime\Email;
  17. use Symfony\Component\Mime\Address;
  18. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  19. use Symfony\Component\Mailer\MailerInterface;
  20. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  21. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  22. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  23. class RegisterController extends AbstractController
  24. {
  25.     private $tokenStorage;
  26.     private $session;
  27.     public function __construct(
  28.         TokenStorageInterface $tokenStorage
  29.         SessionInterface $session
  30.     ) {
  31.         $this->tokenStorage $tokenStorage;
  32.         $this->session $session;
  33.     }
  34.     /**
  35.      * @Route("/professional/register", name="app_transporteur_register")
  36.      */
  37.     public function register(
  38.         AccessClientService $accessClientService
  39.         AddressInfoService $addressInfoService,
  40.         Request $request
  41.         EntityManagerInterface $entityManager
  42.         UserPasswordEncoderInterface $passwordEncoder,
  43.         MailerInterface $mailer
  44.     ): Response
  45.     {
  46.         $accessClientService->handleAccessControl();
  47.     
  48.         $user = new User();
  49.         $transporteur = new Transporteur();
  50.         $originalEmail $user->getEmail();
  51.         $form $this->createForm(TransporteurType::class, $transporteur);
  52.         $form->handleRequest($request);
  53.         
  54.         if ($form->isSubmitted() && $form->isValid()) {
  55.             $civility $form->get('user')->get('civility')->getData();
  56.             $lastname $form->get('user')->get('lastname')->getData();
  57.             $firstname $form->get('user')->get('firstname')->getData();
  58.             $email $form->get('user')->get('email')->getData();
  59.             $plainPassword $form->get('user')->get('password')->getData();
  60.             $address $form->get('address')->getData();
  61.             $posteZip $form->get('postalCode')->getData();
  62.             $ville $form->get('city')->getData();
  63.             $department $form->get('department')->getData();
  64.             $pays $form->get('country')->getData();
  65.             $lon $form->get('longitude')->getData();
  66.             $lat $form->get('latitude')->getData();
  67.             $agreeTerms $form->get('agreeTerms')->getData();
  68.             $user->setCivility($civility);
  69.             $user->setLastname($lastname);
  70.             $user->setFirstname($firstname); 
  71.             $user->setEmail($email);   
  72.             $user->setRoles(['ROLE_TRANSPORTEUR']); 
  73.             $encodedPassword $passwordEncoder->encodePassword($user$plainPassword);
  74.             $user->setPassword($encodedPassword);
  75.             $user->setStatus(User::PENDING_CONFIRMATION);
  76.             $user->setCreatedAtValue();
  77.             $user->preUpdate();
  78.             
  79.             $addressInfo $addressInfoService->getAddressInfo($address);
  80.     
  81.             if ($addressInfo !== null) {
  82.                 $postalCode $addressInfo['postal_code'];
  83.                 $city $addressInfo['city'];
  84.                 $areaAdministrative $addressInfo['department'];
  85.                 $country $addressInfo['country'];
  86.                 $longitude $addressInfo['longitude'];
  87.                 $latitude $addressInfo['latitude'];
  88.             } else {
  89.                 $postalCode null;
  90.                 $city null;
  91.                 $department null;
  92.                 $country null;
  93.                 $longitude null;
  94.                 $latitude null;
  95.             }
  96.             if ($postalCode !== null && $posteZip !== $postalCode) {
  97.                 $transporteur->setPostalCode($postalCode);
  98.             }
  99.             if ($city !== null && $ville !== $city) {
  100.                 $transporteur->setCity($city);
  101.             }
  102.             if ($areaAdministrative !== null && $department !== $areaAdministrative) {
  103.                 $transporteur->setDepartment($department);
  104.             }
  105.             if ($country !== null && $pays->getPays() !== $country) {
  106.                 $transporteur->setCountry($pays);
  107.             }
  108.             if ($lon === null && $longitude !== null) {
  109.                 $transporteur->setLongitude($longitude);
  110.             }
  111.             if ($lat === null && $latitude !== null) {
  112.                 $transporteur->setLatitude($latitude);
  113.             }
  114.             $transporteur->setUser($user);
  115.             $token $transporteur->getConfirmationToken();
  116.             $transporteur->setConfirmationToken($token);
  117.             $parisTimeZone = new \DateTimeZone('Europe/Paris');
  118.             $confirmationTokenCreatedAt = new \DateTime('now'$parisTimeZone);
  119.             $transporteur->setConfirmationTokenCreatedAt($confirmationTokenCreatedAt);
  120.             $transporteur->setAgreeTerms($agreeTerms);
  121.             $entityManager->persist($user);
  122.             $entityManager->persist($transporteur);
  123.             $entityManager->flush();
  124.             $email = (new Email())
  125.                 ->from(new Address('no-reply@resoh.fr''Ryvup.com'))
  126.                 ->to($user->getEmail())
  127.                 ->subject('Confirmation de compte')
  128.                 ->html($this->renderView('emails/confirmation_email.html.twig', [
  129.                     'user' => $user,
  130.                     'confirmationUrl' => $this->generateUrl('app_transporteur_confirm_account', [
  131.                         'confirmationToken' => $transporteur->getConfirmationToken()
  132.                     ], 
  133.                     UrlGeneratorInterface::ABSOLUTE_URL),
  134.                 ]));
  135.             $mailer->send($email);
  136.             
  137.             $this->addFlash('success''Succès ! Nous avons envoyé un lien de confirmation de votre compte à votre adresse e-mail : '$user->getEmail().'. ');
  138.             return $this->redirectToRoute('app_front_login');
  139.         }
  140.         return $this->render('transporteur/register/inscription.html.twig', [
  141.             'transporteur' => $transporteur,
  142.             'form' => $form->createView()
  143.         ]);
  144.     }
  145.     /**
  146.      * @Route("/professional/resend-confirmation/{expirationToken}", name="app_resend_confirmation_link")
  147.      */
  148.     public function resendConfirmation(AccessClientService $accessClientServiceRequest $request$expirationTokenEntityManagerInterface $entityManagerMailerInterface $mailer): Response
  149.     {
  150.         $accessClientService->handleAccessControl();
  151.         $transporteurRepository $entityManager->getRepository(Transporteur::class);
  152.         $transporteur $transporteurRepository->findOneBy(['expirationToken' => $expirationToken]);
  153.         if (!$transporteur) {
  154.             throw new NotFoundHttpException('Votre compte professionnel est introuvable.');
  155.         } 
  156.         $form $this->createForm(ResendConfirmationType::class);
  157.         $form->handleRequest($request);
  158.         if ($form->isSubmitted() && $form->isValid()) {
  159.             $email $form->get('email')->getData();
  160.             $userRepository $entityManager->getRepository(User::class);
  161.             $user $userRepository->findOneBy(['email' => $email]);
  162.             
  163.             if (!$user) {
  164.                 $this->addFlash('danger''Attention ! Aucun utilisateur trouvé avec cette adresse e-mail : ' $email '.');
  165.             } else if ($user && $user->getTransporteur() && $user->getTransporteur()->getExpirationToken()) {
  166.                 $length 20;
  167.                 $alpha "0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN-_";
  168.                 $newToken substr(str_shuffle(str_repeat($alpha$length)), 0$length);
  169.                 $transporteur $user->getTransporteur();
  170.                 $transporteur->setConfirmationToken($newToken);
  171.                 $parisTimeZone = new \DateTimeZone('Europe/Paris');
  172.                 $confirmationTokenCreatedAt = new \DateTime('now'$parisTimeZone);
  173.                 $transporteur->setConfirmationTokenCreatedAt($confirmationTokenCreatedAt);
  174.                 $transporteur->setExpirationToken(null);
  175.                 $entityManager->persist($transporteur);
  176.                 $entityManager->flush();
  177.                 $confirmationUrl $this->generateUrl('app_transporteur_confirm_account', [
  178.                     'confirmationToken' => $newToken
  179.                 ], UrlGeneratorInterface::ABSOLUTE_URL);
  180.                 $email = (new Email())
  181.                     ->from(new Address('no-reply@resoh.fr''Ryvup.com'))
  182.                     ->to($user->getEmail())
  183.                     ->subject('Nouveau lien de confirmation de compte')
  184.                     ->html($this->renderView('emails/new_confirmation_email.html.twig', [
  185.                         'user' => $user,
  186.                         'confirmationUrl' => $confirmationUrl,
  187.                     ]));
  188.                                    
  189.                 $mailer->send($email);
  190.                 $this->addFlash('success''Succès ! Un nouveau lien de confirmation a été envoyé à votre adresse e-mail : '$user->getEmail() .'.');
  191.             } else {
  192.                 $this->addFlash('danger''Attention ! Aucun compte professionnel trouvé avec cette adresse e-mail : ' $email '.');
  193.             }
  194.         }
  195.         return $this->render('transporteur/register/renvoi_confirmation.html.twig', [
  196.             'form' => $form->createView(),
  197.         ]);
  198.     }
  199.     /**
  200.      * @Route("/professional/confirm-account/{confirmationToken}", name="app_transporteur_confirm_account")
  201.      */
  202.     public function confirmAccount(AccessClientService $accessClientServiceRequest $request$confirmationTokenEntityManagerInterface $entityManager): Response
  203.     {
  204.         $accessClientService->handleAccessControl();
  205.         
  206.         $transporteurRepository $entityManager->getRepository(Transporteur::class);
  207.         $transporteur $transporteurRepository->findOneBy(['confirmationToken' => $confirmationToken]);
  208.         if (!$transporteur) {
  209.             throw new NotFoundHttpException('Votre compte professionnel est introuvable pour ce jeton.');
  210.         }
  211.         $user $transporteur->getUser();
  212.         $parisTimezone = new \DateTimeZone('Europe/Paris');        
  213.         $tokenCreatedAt $transporteur->getConfirmationTokenCreatedAt();
  214.         $expirationTime = new \DateTime('-24 hours'$parisTimezone);
  215.         if ($tokenCreatedAt $expirationTime) {
  216.             $length 30;
  217.             $alpha "0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN-_";
  218.             $expirationToken substr(str_shuffle(str_repeat($alpha$length)), 0$length);
  219.             $transporteur->setConfirmationToken(null);
  220.             $transporteur->setConfirmationTokenCreatedAt(null);
  221.             $transporteur->setExpirationToken($expirationToken);
  222.             $entityManager $this->getDoctrine()->getManager();
  223.             $entityManager->persist($transporteur);
  224.             $entityManager->flush();
  225.             $this->addFlash('info''Info ! Votre lien de confirmation a expiré. Renvoyer un nouveau lien à votre adresse email.');
  226.             return $this->redirectToRoute('app_resend_confirmation_link', ['expirationToken' => $expirationToken]);
  227.         }
  228.         $transporteur->setConfirmationToken(null);
  229.         $transporteur->setConfirmationTokenCreatedAt(null);
  230.         $user->setStatus(User::AWAITING_DOCUMENTS);
  231.         $entityManager->persist($transporteur);
  232.         $entityManager->persist($user);
  233.         $entityManager->flush();
  234.         $this->addFlash('success''Succès ! Votre compte est confirmé mais en attente de validation des pièces justificative.');
  235.         return $this->redirectToRoute('app_front_login');
  236.     }
  237.     
  238. }