src/Controller/Security/SignUpController.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Security;
  3. use App\Entity\BusinessSubscription;
  4. use App\Entity\CustomerPhysical;
  5. use App\Entity\User;
  6. use App\Form\B2cSubscriptionType;
  7. use App\Form\BusinessSubscriptionType;
  8. use App\Form\UserType;
  9. use App\Repository\CustomerRepository;
  10. use App\Repository\MarketRepository;
  11. use App\Repository\UserRepository;
  12. use App\Service\EmailService;
  13. use App\Service\FrontService;
  14. use App\Service\ParameterService;
  15. use App\Service\SignUpService;
  16. use DateTime;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Sherlockode\ConfigurationBundle\Manager\ParameterManagerInterface;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  25. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. class SignUpController extends AbstractController
  28. {
  29.     public function __construct(private readonly EmailService              $emailService,
  30.                                 private readonly ParameterManagerInterface $parameterManager,
  31.                                 private readonly TranslatorInterface       $translator,
  32.                                 private readonly FrontService              $frontService,
  33.                                 private readonly ParameterService          $parameterService,
  34.                                 private readonly SignUpService             $signUpService,
  35.     )
  36.     {
  37.     }
  38.     #[Route('/signUp'name'app_signUp'methods: ['GET''POST'])]
  39.     public function signUp(Request                     $request,
  40.                            UserPasswordHasherInterface $userPasswordHasher,
  41.                            EntityManagerInterface      $entityManager,
  42.                            MarketRepository            $marketRepository,
  43.                            CustomerRepository          $customerRepository,
  44.     ): Response
  45.     {
  46.         $user = new User();
  47.         $user->setRoles(['ROLE_B2C']);
  48.         $user->setIsVerified(false);
  49.         $user->setActive(false);
  50.         $form $this->createForm(B2cSubscriptionType::class, $user);
  51.         $form->handleRequest($request);
  52.         if ($form->isSubmitted() && $form->isValid()) {
  53.             $user->setPassword(
  54.                 $userPasswordHasher->hashPassword(
  55.                     $user,
  56.                     $form->get('password')->getData()
  57.                 )
  58.             );
  59.             $user->setUsername($user->getEmail());
  60.             $customer = new CustomerPhysical();
  61.             $customer->setEmail($user->getEmail());
  62.             $customer->setCivility("");
  63.             $customer->setFirstName($request->get('firstName'));
  64.             $customer->setLastName($request->get('lastName'));
  65.             $customer->setName($request->get('firstName'). ' '.$request->get('lastName'));
  66.             $customer->setShowAllHotelXml(true);
  67.             $customer->setMarket($marketRepository->find(1));
  68.             $customer->setCreatedAt(new DateTime());
  69.             $customer->setUpdatedAt(new DateTime());
  70.             $customer->setActive(false);
  71.             $customer->setCurrency($customerRepository->findOneBy(['isDefault' => 1])->getCurrency());
  72.             $email $this->signUpService->prepareWelcomeEmailForCustomerB2C($customer);
  73.             $user->setCustomer($customer);
  74.             //$user->setPersonal(null);
  75.             //$entityManager->persist($customer);
  76.             $entityManager->persist($user);
  77.             $entityManager->persist($email);
  78.             $entityManager->flush();
  79.             $message $this->translator->trans(
  80.                 'Pages.SignUp.Alerts.CheckEmail',
  81.                 ['%email%' => $customer->getEmail()],
  82.                 'messages_front'
  83.             );
  84.             $this->addFlash('success'$message);
  85.             return $this->redirectToRoute("front_info_message");
  86.         }
  87.         return $this->renderForm('security/btoc/sign_up_btoc.html.twig', [
  88.             'form'              => $form,
  89.             'society'           => $this->parameterService->getSocietyParameters(),
  90.             'social_networks'   => $this->frontService->getSocialNetworks(),
  91.             'currencies'        => $this->frontService->getCurrencies(),
  92.             'agencies'          => $this->frontService->getAgencies()
  93.         ]);
  94.     }
  95.     #[Route('/verify/{token}'name'app_signup_verify_email')]
  96.     public function verifyUser(string                 $token,
  97.                                EntityManagerInterface $entityManager,
  98.                                UserRepository         $userRepository,
  99.                                TokenStorageInterface  $tokenStorage,
  100.     ): Response
  101.     {
  102.         // Find the user by the verification token
  103.         $user $userRepository->findOneBy(['email' => base64_decode($token)]);
  104.         // error token
  105.         if(!$user){
  106.             $this->addFlash('error'"Une erreur est survenue. Merci de vérifier le lien d'activation");
  107.             return $this->redirectToRoute('front_info_message');
  108.         }
  109.         // error already verified
  110.         if($user->isVerified()){
  111.             $message "Votre compte ".$user->getEmail()." est déjà activé";
  112.             $this->addFlash('error'$message);
  113.             return $this->redirectToRoute('front_info_message');
  114.         }
  115.         // verify account (B2C)
  116.         $customer $user->getCustomer();
  117.         if (!$user->isVerified() && $customer && $customer instanceof CustomerPhysical) {
  118.             $user->setIsVerified(true);
  119.             $user->setActive(true);
  120.             $customer->setActive(true);
  121.             $entityManager->persist($customer);
  122.             $entityManager->persist($user);
  123.             $entityManager->flush();
  124. //            // these two lines are commented to impose signIn using LoginController
  125. //            $token = new UsernamePasswordToken($user, "main", $user->getRoles());
  126. //            $tokenStorage->setToken($token);
  127.             $message $this->translator->trans(
  128.                 'Pages.SignUp.Alerts.AcountActivated',
  129.                 ['%email%' => $customer->getEmail()],
  130.                 'messages_front'
  131.             );
  132.             $this->addFlash('success'$message);
  133.             return $this->redirectToRoute('front_info_message');
  134.         }
  135.         $this->addFlash('error'"Une erreur est survenue. Merci de vérifier le lien d'activation");
  136.         return $this->redirectToRoute('app_main');
  137.     }
  138.     #[Route('/signUpBtob'name'app_signUp_btob'methods: ['GET''POST'])]
  139.     function signUpBtob(
  140.                 Request $request,
  141.                 ParameterService $parameterService,
  142.                 EntityManagerInterface $entityManager,
  143.     ): Response
  144.     {
  145.         $subscription = new BusinessSubscription();
  146.         $subscription->setCreatedAt(new DateTime());
  147.         $subscription->setUpdatedAt(new DateTime());
  148.         $subscription->setApproved(null);
  149.         $form $this->createForm(BusinessSubscriptionType::class, $subscription);
  150.         $form->handleRequest($request);
  151.         if ($form->isSubmitted() && $form->isValid()) {
  152.             $emailForCustomer $this->signUpService->prepareB2BSubscriptionEmailToCustomer($subscription);
  153.             $emailForSociety $this->signUpService->prepareB2BSubscriptionEmailToSociety($subscription);
  154.             $entityManager->persist($subscription);
  155.             $entityManager->persist($emailForCustomer);
  156.             $entityManager->persist($emailForSociety);
  157.             $entityManager->flush();
  158.             $message "Votre demande d'inscription B2B a bien été reçue. Nous vous contacterons prochainement.";
  159.             $this->addFlash('success'$message);
  160.             return $this->redirectToRoute("front_info_message");
  161.         }
  162.         return $this->renderForm('security/btob/_sign_up_btob.html.twig', [
  163.             'agency'            => $parameterService->getSocietyParameters(),
  164.             'form'              => $form,
  165.             'society'           => $this->parameterService->getSocietyParameters(),
  166.             'social_networks'   => $this->frontService->getSocialNetworks(),
  167.             'currencies'        => $this->frontService->getCurrencies(),
  168.             'agencies'          => $this->frontService->getAgencies(),
  169.             'btn_login'         => 'btn-primary btn-login px-5'
  170.         ]);
  171.     }
  172.     #[Route('/define-password/{email}/{token}'name'app_account_define_password'methods: ['GET''POST'])]
  173.     public function defineUserPassword(
  174.                                        $email,
  175.                                        $token,
  176.                                        Request               $request,
  177.                                        UserRepository        $userRepository,
  178.                                        TokenStorageInterface $tokenStorage,
  179.                                        UserPasswordHasherInterface $userPasswordHasher
  180.     ): Response
  181.     {
  182.         $user $userRepository->findOneBy(['email' => $email]);
  183.         //$validToken = hash('md5', $user->getEmail());
  184.         $validToken base64_encode($email);
  185.         if($validToken != $token){
  186.             $this->addFlash('error' 'An error has occured !');
  187.             return $this->redirectToRoute('front_info_message');
  188.         }
  189.         $form $this->createForm(UserType::class, $user, [
  190.             'disable_username' => true,
  191.             'disable_email' => true
  192.         ]);
  193.         $form->handleRequest($request);
  194.         if ($form->isSubmitted() && $form->isValid()) {
  195.             $user->setPassword(
  196.                 $userPasswordHasher->hashPassword(
  197.                     $user,
  198.                     $form->get('password')->get('first')->getData()
  199.                 )
  200.             );
  201.             $userRepository->add($usertrue);
  202.             //login
  203.             $token = new UsernamePasswordToken($user"main"$user->getRoles());
  204.             $tokenStorage->setToken($token);
  205.             return $this->redirectToRoute('app_main');
  206.         }
  207.         return $this->renderForm('user/new.html.twig', [
  208.             'form' => $form,
  209.             'society'           => $this->parameterService->getSocietyParameters(),
  210.             'social_networks'   => $this->frontService->getSocialNetworks(),
  211.             'currencies'        => $this->frontService->getCurrencies(),
  212.             'agencies'          => $this->frontService->getAgencies()
  213.         ]);
  214.     }
  215. }