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.             //dd($user);
  80.             $message "Veuillez consulter votre email "$customer->getEmail(). " pour valider votre compte";
  81.             $this->addFlash('success'$message);
  82.             return $this->redirectToRoute("front_info_message");
  83.         }
  84.         return $this->renderForm('security/btoc/sign_up_btoc.html.twig', [
  85.             'form'              => $form,
  86.             'society'           => $this->parameterService->getSocietyParameters(),
  87.             'social_networks'   => $this->frontService->getSocialNetworks(),
  88.             'currencies'        => $this->frontService->getCurrencies(),
  89.             'agencies'          => $this->frontService->getAgencies()
  90.         ]);
  91.     }
  92.     #[Route('/verify/{token}'name'app_signup_verify_email')]
  93.     public function verifyUser(string                 $token,
  94.                                EntityManagerInterface $entityManager,
  95.                                UserRepository         $userRepository,
  96.                                TokenStorageInterface  $tokenStorage,
  97.     ): Response
  98.     {
  99.         // Find the user by the verification token
  100.         $user $userRepository->findOneBy(['email' => base64_decode($token)]);
  101.         // error token
  102.         if(!$user){
  103.             $this->addFlash('error'"Une erreur est survenue. Merci de vérifier le lien d'activation");
  104.             return $this->redirectToRoute('front_info_message');
  105.         }
  106.         // error already verified
  107.         if($user->isVerified()){
  108.             $message "Votre compte ".$user->getEmail()." est déjà activé";
  109.             $this->addFlash('error'$message);
  110.             return $this->redirectToRoute('front_info_message');
  111.         }
  112.         // verify account (B2C)
  113.         $customer $user->getCustomer();
  114.         if (!$user->isVerified() && $customer && $customer instanceof CustomerPhysical) {
  115.             $user->setIsVerified(true);
  116.             $user->setActive(true);
  117.             $customer->setActive(true);
  118.             $entityManager->persist($customer);
  119.             $entityManager->persist($user);
  120.             $entityManager->flush();
  121. //            // these two lines are commented to impose signIn using LoginController
  122. //            $token = new UsernamePasswordToken($user, "main", $user->getRoles());
  123. //            $tokenStorage->setToken($token);
  124.             $message "Félicitation, votre compte ".$user->getEmail()." est maintenant activé ! ";
  125.             $this->addFlash('success'$message);
  126.             return $this->redirectToRoute('front_info_message');
  127.         }
  128.         $this->addFlash('error'"Une erreur est survenue. Merci de vérifier le lien d'activation");
  129.         return $this->redirectToRoute('app_main');
  130.     }
  131.     #[Route('/signUpBtob'name'app_signUp_btob'methods: ['GET''POST'])]
  132.     function signUpBtob(
  133.                 Request $request,
  134.                 ParameterService $parameterService,
  135.                 EntityManagerInterface $entityManager,
  136.     ): Response
  137.     {
  138.         $subscription = new BusinessSubscription();
  139.         $subscription->setCreatedAt(new DateTime());
  140.         $subscription->setUpdatedAt(new DateTime());
  141.         $subscription->setApproved(null);
  142.         $form $this->createForm(BusinessSubscriptionType::class, $subscription);
  143.         $form->handleRequest($request);
  144.         if ($form->isSubmitted() && $form->isValid()) {
  145.             $emailForCustomer $this->signUpService->prepareB2BSubscriptionEmailToCustomer($subscription);
  146.             $emailForSociety $this->signUpService->prepareB2BSubscriptionEmailToSociety($subscription);
  147.             $entityManager->persist($subscription);
  148.             $entityManager->persist($emailForCustomer);
  149.             $entityManager->persist($emailForSociety);
  150.             $entityManager->flush();
  151.             $message "Votre demande d'inscription B2B a bien été reçue. Nous vous contacterons prochainement.";
  152.             $this->addFlash('success'$message);
  153.             return $this->redirectToRoute("front_info_message");
  154.         }
  155.         return $this->renderForm('security/btob/_sign_up_btob.html.twig', [
  156.             'agency'            => $parameterService->getSocietyParameters(),
  157.             'form'              => $form,
  158.             'society'           => $this->parameterService->getSocietyParameters(),
  159.             'social_networks'   => $this->frontService->getSocialNetworks(),
  160.             'currencies'        => $this->frontService->getCurrencies(),
  161.             'agencies'          => $this->frontService->getAgencies(),
  162.             'btn_login'         => 'btn-primary btn-login px-5'
  163.         ]);
  164.     }
  165.     #[Route('/define-password/{email}/{token}'name'app_account_define_password'methods: ['GET''POST'])]
  166.     public function defineUserPassword(
  167.                                        $email,
  168.                                        $token,
  169.                                        Request               $request,
  170.                                        UserRepository        $userRepository,
  171.                                        TokenStorageInterface $tokenStorage,
  172.                                        UserPasswordHasherInterface $userPasswordHasher
  173.     ): Response
  174.     {
  175.         $user $userRepository->findOneBy(['email' => $email]);
  176.         //$validToken = hash('md5', $user->getEmail());
  177.         $validToken base64_encode($email);
  178.         if($validToken != $token){
  179.             $this->addFlash('error' 'An error has occured !');
  180.             return $this->redirectToRoute('front_info_message');
  181.         }
  182.         $form $this->createForm(UserType::class, $user, [
  183.             'disable_username' => true,
  184.             'disable_email' => true
  185.         ]);
  186.         $form->handleRequest($request);
  187.         if ($form->isSubmitted() && $form->isValid()) {
  188.             $user->setPassword(
  189.                 $userPasswordHasher->hashPassword(
  190.                     $user,
  191.                     $form->get('password')->get('first')->getData()
  192.                 )
  193.             );
  194.             $userRepository->add($usertrue);
  195.             //login
  196.             $token = new UsernamePasswordToken($user"main"$user->getRoles());
  197.             $tokenStorage->setToken($token);
  198.             return $this->redirectToRoute('app_main');
  199.         }
  200.         return $this->renderForm('user/new.html.twig', [
  201.             'form' => $form,
  202.             'society'           => $this->parameterService->getSocietyParameters(),
  203.             'social_networks'   => $this->frontService->getSocialNetworks(),
  204.             'currencies'        => $this->frontService->getCurrencies(),
  205.             'agencies'          => $this->frontService->getAgencies()
  206.         ]);
  207.     }
  208. }