src/Controller/Front/UserRegistrationController.php line 89

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use DateTime;
  4. use Stripe\Stripe;
  5. use App\Entity\Club;
  6. use App\Entity\User;
  7. use App\Entity\Coach;
  8. use App\Entity\Trainee;
  9. use App\Entity\Operator;
  10. use App\Entity\CoachInfo;
  11. use App\Entity\StripeInfo;
  12. use App\Entity\Availability;
  13. use App\Entity\SportTrainee;
  14. use App\Service\BrevoService;
  15. use App\Service\StripeService;
  16. use App\Service\TwilioService;
  17. use App\EmailNotification\ToPro;
  18. use App\Service\SinchSmsService;
  19. use App\Form\TraineeRegisterType;
  20. use Sentry\Transport\RateLimiter;
  21. use App\Form\ClubRegistrationType;
  22. use App\Repository\RoleRepository;
  23. use App\Repository\UserRepository;
  24. use App\Form\CoachRegistrationType;
  25. use App\Repository\SportRepository;
  26. use App\Service\RateLimiterService;
  27. use App\EmailNotification\ToTrainee;
  28. use App\Service\InternationalService;
  29. use App\Form\OperatorRegistrationType;
  30. use Doctrine\ORM\EntityManagerInterface;
  31. use App\Repository\NoteRequestRepository;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use Symfony\Component\Routing\Annotation\Route;
  34. use Symfony\Component\HttpFoundation\JsonResponse;
  35. use Symfony\Component\HttpFoundation\RequestStack;
  36. use Symfony\Component\String\Slugger\AsciiSlugger;
  37. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  38. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  39. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  40. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  41. #[Route(path'{_locale}')]
  42. class UserRegistrationController extends AbstractController
  43. {
  44.     private $apiKey;
  45.     private $stripe;
  46.     private $request;
  47.     private $internationalService;
  48.     public function __construct(RequestStack $requestStackInternationalService $internationalService, private BrevoService $brevoService, private SinchSmsService $sinchSmsService)
  49.     {
  50.         $this->apiKey $_ENV['STRIPE_SECRET_KEY'];
  51.         $this->request $requestStack->getCurrentRequest();
  52.         $this->stripe $this->stripe = new \Stripe\StripeClient($this->apiKey);
  53.         $this->internationalService $internationalService;
  54.     }
  55.     private function generateString(int $length 64)
  56.     {
  57.         $length = ($length 4) ? $length;
  58.         return bin2hex(random_bytes(($length - ($length 2)) / 2));
  59.     }
  60.     public function createStripeCustomer(User $pro)
  61.     {
  62.         $customer $this->stripe->customers->create([
  63.             'email' => $pro->getEmail(),
  64.             'name' => $pro->getFirstname() . '  ' $pro->getLastname(),
  65.             'address' => ['country' => $pro->getAddress()->getCountryCode()],
  66.             'expand' => ['tax']
  67.         ]);
  68.         return $customer;
  69.     }
  70.     public function createStripeAccount(User $pro)
  71.     {
  72.         $account $this->stripe->accounts->create([
  73.             'type' => 'standard',
  74.             'email' => $pro->getEmail()
  75.         ]);
  76.         return $account;
  77.     }
  78.     #[Route(path'/trainee-registration'name'trainee_registration')]
  79.     public function register(Request $request)
  80.     {
  81.         if ($this->getUser() != null) {
  82.             return $this->redirectToRoute('homepage');
  83.         }
  84.         $session $request->getSession();
  85.         $session->set('userType''trainee');
  86.         return $this->redirectToRoute('registration_email');
  87.     }
  88.     #[Route(path'/pro-registration'name'pro_registration_type'methods: ['POST'])]
  89.     public function userType(Request $request)
  90.     {
  91.         $user $this->getUser();
  92.         if ($user != null) {
  93.             return $this->redirectToRoute('homepage');
  94.         }
  95.         $userType $request->request->get('userType');
  96.         if ($userType) {
  97.             $session $request->getSession();
  98.             if (in_array($userType, ['coach''club''operator'])) {
  99.                 $session->set('userType'$userType);
  100.                 return $this->redirectToRoute('registration_email');
  101.             }
  102.         }
  103.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  104.         return $this->redirectToRoute('membership_presentation');
  105.     }
  106.     #[Route(path'/registration-email'name'registration_email')]
  107.     public function registrationEmail(Request $request)
  108.     {
  109.         if ($this->getUser() != null) {
  110.             return $this->redirectToRoute('homepage');
  111.         }
  112.         $session $request->getSession();
  113.         $userType $session->get('userType');
  114.         return $this->render('front/registration/registration-1.html.twig', [
  115.             'userType' => $userType,
  116.             'step' => 1
  117.         ]);
  118.     }
  119.     #[Route(path'/send-email-verification-code'name'registration_send_email_verification_code'methods: ['POST'])]
  120.     public function sendEmailVerificationCode(Request $requestUserRepository $userRepositoryToPro $toPro)
  121.     {
  122.         \sleep(1);
  123.         $data json_decode($request->getContent(), true);
  124.         $email $data['email'] ?? null;
  125.         $isUpdate $data['isUpdate'] ?? null;
  126.         $session $request->getSession();
  127.         if ($email) {
  128.             $existingUser $userRepository->findOneBy(['email' => $email]);
  129.             if ($existingUser) {
  130.                 $this->addFlash('error''Un compte existe déjà avec cet email');
  131.                 return new JsonResponse(['status' => 'error']);
  132.             }
  133.             $session->set('registrationEmail'$email);
  134.             // Génère un code
  135.             $code random_int(123456987600);
  136.             $session->set('verificationCode'$code);
  137.             $locale $this->request->getLocale();
  138.             $toPro->sendVericationCode($email$code$locale$isUpdate);
  139.             return new JsonResponse(['status' => 'success']);
  140.         }
  141.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  142.         return new JsonResponse(['status' => 'error']);
  143.     }
  144.     #[Route(path'/verify-email-code'name'registration_verify_email_code'methods: ['POST'])]
  145.     public function verifyEmailCode(Request $requestEntityManagerInterface $entityManager)
  146.     {
  147.         \sleep(1);
  148.         $data json_decode($request->getContent(), true);
  149.         $email $data['email'] ?? null;
  150.         $code $data['code'] ?? null;
  151.         $isUpdate $data['isUpdate'] ?? null;
  152.         $session $request->getSession();
  153.         $emailSession $session->get('registrationEmail');
  154.         if ($emailSession != $email && !$isUpdate) {
  155.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  156.             return new JsonResponse(['status' => 'error''type' => 'error1''emailSession' => $emailSession'email' => $email]);
  157.         }
  158.         if ($email && $code) {
  159.             if ($code != $session->get('verificationCode')) {
  160.                 return new JsonResponse(['status' => 'error''type' => 'errorCode''message' => 'Code invalide']);
  161.             }
  162.             if (!$isUpdate) {
  163.                 $session->set('registrationEmailVerified'true);
  164.                 $session->remove('verificationCode');
  165.             }
  166.             if ($isUpdate) {
  167.                 /**
  168.                  * @var User $user
  169.                  */
  170.                 $user $this->getUser();
  171.                 $user->setEmail($email);
  172.                 $entityManager->persist($user);
  173.                 $entityManager->flush();
  174.                 $this->addFlash('success''Email mis à jour avec succès');
  175.                 if ($user->getIsPro()) {
  176.                     $redirectionUrl $this->generateUrl('pro_parameters');
  177.                 } else {
  178.                     $redirectionUrl $this->generateUrl('trainee_profile');
  179.                 }
  180.             } else {
  181.                 $redirectionUrl $this->generateUrl('registration_password');
  182.             }
  183.             return new JsonResponse(['status' => 'success''redirectionUrl' => $redirectionUrl]);
  184.         }
  185.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  186.         return new JsonResponse(['status' => 'error''type' => 'error2''email' => $email'code' => $code]);
  187.     }
  188.     #[Route(path'/registration-password'name'registration_password')]
  189.     public function registrationPassword(Request $request)
  190.     {
  191.         $user $this->getUser();
  192.         if ($user != null) {
  193.             return $this->redirectToRoute('homepage');
  194.         }
  195.         $session $request->getSession();
  196.         $userType $session->get('userType');
  197.         if ($session->get('registrationEmailVerified') != true) {
  198.             return $this->redirectToRoute('registration_email');
  199.         }
  200.         if ($request->request->get('password')) {
  201.             $session->set('registrationPassword'$request->request->get('password'));
  202.             return $this->redirectToRoute('registration_phone');
  203.         }
  204.         return $this->render('front/registration/registration-2.html.twig', [
  205.             'userType' => $userType,
  206.             'step' => 2
  207.         ]);
  208.     }
  209.     #[Route(path'/registration-phone'name'registration_phone')]
  210.     public function registrationPhone(Request $request)
  211.     {
  212.         $user $this->getUser();
  213.         if ($user != null) {
  214.             return $this->redirectToRoute('homepage');
  215.         }
  216.         $session $request->getSession();
  217.         $userType $session->get('userType');
  218.         if ($session->get('registrationEmailVerified') != true) {
  219.             return $this->redirectToRoute('registration_email');
  220.         }
  221.         if ($session->get('registrationPassword') != true) {
  222.             return $this->redirectToRoute('registration_password');
  223.         }
  224.         return $this->render('front/registration/registration-3.html.twig', [
  225.             'userType' => $userType,
  226.             'step' => 3
  227.         ]);
  228.     }
  229.     #[Route(path'/send-phone-verification-code'name'registration_send_phone_verification_code'methods: ['POST'])]
  230.     public function sendPhoneVerificationCode(Request $requestRateLimiterService $rateLimiter)
  231.     {
  232.         \sleep(1);
  233.         $data json_decode($request->getContent(), true);
  234.         $phone $data['phone'] ?? null;
  235.         $isUpdate $data['isUpdate'] ?? false;
  236.         $ip $request->getClientIp();
  237.         if ($rateLimiter->hit($ipmaxAttempts5windowSeconds3600)) {
  238.             return $this->json([
  239.                 'status'  => 'error',
  240.                 'type'    => 'rate_limit',
  241.                 'message' => 'Trop de tentatives. Réessayez dans 1h.'
  242.             ], 429);
  243.         }
  244.         $session $request->getSession();
  245.         if ($phone) {
  246.             // Génère un code
  247.             $code random_int(123456987600);
  248.             $session->set('verificationCode'$code);
  249.             $message "Votre code de vérification Racket Trip est : " $code;
  250.             try {
  251.                 $this->sinchSmsService->sendSms($phone$message);
  252.                 //$twilioService->sendSms($phone, $message);
  253.             } catch (\Exception $e) {
  254.                 return new JsonResponse(['status' => 'error''message' => 'Numéro de téléphone invalide.'], 400);
  255.             }
  256.             $session->set('registrationPhone'$phone);
  257.             return new JsonResponse(['status' => 'success']);
  258.         }
  259.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  260.         return new JsonResponse(['status' => 'error']);
  261.     }
  262.     #[Route(path'/verify-phone-code'name'registration_verify_phone_code'methods: ['POST'])]
  263.     public function verifyPhoneCode(Request $requestEntityManagerInterface $entityManager)
  264.     {
  265.         \sleep(1);
  266.         $data json_decode($request->getContent(), true);
  267.         $phone $data['phone'] ?? null;
  268.         $code $data['code'] ?? null;
  269.         $isUpdate $data['isUpdate'] ?? false;
  270.         $session $request->getSession();
  271.         $emailSession $session->get('registrationPhone');
  272.         if ($emailSession != $phone && !$isUpdate) {
  273.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  274.             return new JsonResponse(['status' => 'error''type' => 'error']);
  275.         }
  276.         if ($phone && $code) {
  277.             if ($code != $session->get('verificationCode')) {
  278.                 return new JsonResponse(['status' => 'error''type' => 'errorCode''message' => 'Code invalide']);
  279.             }
  280.             if (!$isUpdate) {
  281.                 $session->set('registrationPhoneVerified'true);
  282.                 $session->remove('verificationCode');
  283.                 $userType $session->get('userType');
  284.             }
  285.             if ($isUpdate) {
  286.                 /**
  287.                  * @var User $user
  288.                  */
  289.                 $user $this->getUser();
  290.                 $user->setTelephone($phone);
  291.                 $entityManager->persist($user);
  292.                 $entityManager->flush();
  293.                 $this->addFlash('success''Téléphone mis à jour avec succès');
  294.                 if ($user->getIsPro()) {
  295.                     $redirectionUrl $this->generateUrl('pro_parameters');
  296.                 } else {
  297.                     $redirectionUrl $this->generateUrl('trainee_profile');
  298.                 }
  299.             } else {
  300.                 // Redirection vers la page d'informations
  301.                 if (in_array($userType, ['coach''club''operator'])) {
  302.                     $redirectionUrl $this->generateUrl('pro_registration_informations');
  303.                 } else {
  304.                     $redirectionUrl $this->generateUrl('trainee_registration_informations');
  305.                 }
  306.             }
  307.             return new JsonResponse(['status' => 'success''redirectionUrl' => $redirectionUrl]);
  308.         }
  309.         $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  310.         return new JsonResponse(['status' => 'error''type' => 'error']);
  311.     }
  312.     #[Route(path'/pro-registration-informations'name'pro_registration_informations')]
  313.     public function registration(Request $requestEntityManagerInterface $managerRoleRepository $roleRepositoryUserPasswordHasherInterface $passwordHasher)
  314.     {
  315.         if ($this->getUser() != null) {
  316.             return $this->redirectToRoute('homepage');
  317.         }
  318.         $slugger = new AsciiSlugger();
  319.         $timeZone $this->internationalService->findVisitorTimeZone();
  320.         $session $request->getSession();
  321.         $userType $session->get('userType');
  322.         $email $session->get('registrationEmail');
  323.         $phone $session->get('registrationPhone');
  324.         $password $session->get('registrationPassword');
  325.         if ($userType == null || $email == null || $password == null || $phone == null) {
  326.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  327.             return $this->redirectToRoute('homepage');
  328.         }
  329.         // Choix de l'entité et du FormType
  330.         switch ($userType) {
  331.             case 'coach':
  332.                 $pro = new Coach();
  333.                 $formType CoachRegistrationType::class;
  334.                 break;
  335.             case 'club':
  336.                 $pro = new Club();
  337.                 $formType ClubRegistrationType::class;
  338.                 break;
  339.             case 'operator':
  340.                 $pro = new Operator();
  341.                 $formType OperatorRegistrationType::class;
  342.                 break;
  343.             default:
  344.                 $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  345.                 return $this->redirectToRoute('membership_presentation');
  346.         }
  347.         $form $this->createForm($formType$pro);
  348.         $form->handleRequest($request);
  349.         if ($form->isSubmitted() && $form->isValid()) {
  350.             $hashed $passwordHasher->hashPassword($pro$password);
  351.             $pro->setEmail($email)
  352.                 ->setTelephone($phone)
  353.                 ->setPassword($hashed);
  354.             $proInfo $pro->getProInfo();
  355.             $proInfo->setPageVisible(false)
  356.                 ->setCoverPhoto('cover.png')
  357.                 ->setContactEmail($pro->getEmail());
  358.             // Particularités selon le userType
  359.             switch ($userType) {
  360.                 case 'coach':
  361.                     $proInfo->setFullname($pro->getFirstname() . ' ' $pro->getLastname());
  362.                     $coachInfo = new CoachInfo();
  363.                     $coachInfo->setOwner($pro)
  364.                         ->setName($proInfo->getFullname())
  365.                         ->setAddress($pro->getAddress());
  366.                     $manager->persist($coachInfo);
  367.                     break;
  368.                 case 'club':
  369.                     $proInfo->setFullname($pro->getClubInfo()->getName());
  370.                     $clubInfo $pro->getClubInfo();
  371.                     $clubInfo->setOwner($pro)
  372.                         ->setName($proInfo->getFullname())
  373.                         ->setAddress($pro->getAddress());
  374.                     $manager->persist($clubInfo);
  375.                     break;
  376.                 case 'operator':
  377.                     $proInfo->setFullname($pro->getOperatorInfo()->getName());
  378.                     $operatorInfo $pro->getOperatorInfo();
  379.                     $operatorInfo->setOwner($pro);
  380.                     $proInfo->setFullname($operatorInfo->getName())
  381.                         ->setContactEmail($pro->getEmail());
  382.                     $manager->persist($operatorInfo);
  383.                     break;
  384.             }
  385.             // Gestion des sports
  386.             foreach ($proInfo->getSports() as $sport) {
  387.                 $sport->addPro($proInfo);
  388.                 $manager->persist($sport);
  389.                 // Seulement pour club ➔ créer des disponibilités
  390.                 if ($userType === 'club') {
  391.                     $availability = new Availability();
  392.                     $availability->setSport($sport)->setClub($pro);
  393.                     $manager->persist($availability);
  394.                 }
  395.             }
  396.             $slug strtolower($slugger->slug(
  397.                 ($userType === 'coach'
  398.                     $pro->getFirstname() . '-' $pro->getLastname()
  399.                     : $proInfo->getFullname()
  400.                 ) . '-' rand(1000098765)
  401.             ));
  402.             $role $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  403.             $pro->setRegisteredAt(new \DateTime())
  404.                 ->setToken($this->generateString(32))
  405.                 ->setIsPro(true)
  406.                 ->setSlug($slug)
  407.                 ->setPhoto('default-profile.png')
  408.                 ->setTimezone($timeZone)
  409.                 ->setNotification(true)
  410.                 ->setActivated(false)
  411.                 ->setHasAccess(false)
  412.                 ->addUserRole($role)
  413.                 ->setPassword($hashed)
  414.                 ->setStatus('online')
  415.                 ->setLanguage($this->request->getLocale());
  416.             // Spécificité pour lier clubInfo / operatorInfo
  417.             if ($userType === 'club') {
  418.                 $clubInfo $pro->getClubInfo();
  419.                 $clubInfo->setOwner($pro)
  420.                     ->setName($proInfo->getFullname())
  421.                     ->setAddress($pro->getAddress());
  422.                 $manager->persist($clubInfo);
  423.             }
  424.             if ($userType === 'operator') {
  425.                 $operatorInfo $pro->getOperatorInfo();
  426.                 $operatorInfo->setOwner($pro);
  427.                 $manager->persist($operatorInfo);
  428.             }
  429.             try {
  430.                 $manager->persist($proInfo);
  431.                 $manager->persist($pro);
  432.                 $manager->flush();
  433.             } catch (\Throwable $th) {
  434.                 $this->addFlash('error'"Une erreur s'est produite. Veuillez réessayer.");
  435.                 return $this->redirectToRoute('pro_registration_type');
  436.             }
  437.             if ($pro->getNewsletter()) {
  438.                 $this->brevoService->createBrevoContact(
  439.                     method_exists($pro'getFirstname') ? $pro->getFirstname() : '',
  440.                     method_exists($pro'getLastname') ? $pro->getLastname() : '',
  441.                     $pro->getEmail(),
  442.                     'pro'
  443.                 );
  444.             }
  445.             return $this->redirectToRoute('pro_activate_account', [
  446.                 'token' => $pro->getToken()
  447.             ]);
  448.         }
  449.         return $this->render('front/registration/registration-pro.html.twig', [
  450.             'form' => $form->createView(),
  451.             'userType' => $userType,
  452.             'step' => 5
  453.         ]);
  454.     }
  455.     #[Route(path'/trainee-registration-informations'name'trainee_registration_informations')]
  456.     public function traineeRegistration(Request $requestEntityManagerInterface $managerBrevoService $brevoServiceRoleRepository $roleRepositoryUserPasswordHasherInterface $passwordHasherToTrainee $toTraineeSportRepository $sportRepo)
  457.     {
  458.         if ($this->getUser() != null) {
  459.             return $this->redirectToRoute('homepage');
  460.         }
  461.         $timeZone $this->internationalService->findVisitorTimeZone();
  462.         $session $request->getSession();
  463.         $userType $session->get('userType');
  464.         $email $session->get('registrationEmail');
  465.         $phone $session->get('registrationPhone');
  466.         $password $session->get('registrationPassword');
  467.         if ($userType == null || $email == null || $password == null || $phone == null) {
  468.             $this->addFlash('error''Une erreur est survenue. Veuillez réessayer.');
  469.             return $this->redirectToRoute('homepage');
  470.         }
  471.         $trainee = new Trainee();
  472.         $trainee->setTimezone($timeZone);
  473.         $sports $sportRepo->findAll();
  474.         foreach ($sports as $sport) {
  475.             $sportTrainee = new SportTrainee();
  476.             $sportTrainee->setTrainee($trainee)
  477.                 ->setSport($sport);
  478.             $trainee->addSport($sportTrainee);
  479.         }
  480.         $form $this->createForm(TraineeRegisterType::class, $trainee);
  481.         $form->handleRequest($request);
  482.         if ($form->isSubmitted() && $form->isValid()) {
  483.             $password $trainee->getPassword();
  484.             $hashed $passwordHasher->hashPassword($trainee$password);
  485.             $sportsTrainee $trainee->getSports();
  486.             foreach ($sportsTrainee as $sportsTrainee) {
  487.                 if ($sportsTrainee->getLevel() == null) {
  488.                     $trainee->removeSport($sportsTrainee);
  489.                 } else {
  490.                     $manager->persist($sportsTrainee);
  491.                 }
  492.             }
  493.             $slugger = new AsciiSlugger();
  494.             $slug strtolower($slugger->slug($trainee->getFirstname() . '-' $trainee->getLastname() . '-' rand(1000098765)));
  495.             $role $roleRepository->findOneBy(['title' => 'ROLE_TRAINEE']);
  496.             $trainee->setRegisteredAt(new DateTime())
  497.                 ->setToken($this->generateString(32))
  498.                 ->addUserRole($role)
  499.                 ->setSlug($slug)
  500.                 ->setEmail($email)
  501.                 ->setPassword($hashed)
  502.                 ->setTelephone($phone)
  503.                 ->setTimezone($timeZone)
  504.                 ->setPhoto('default-profile.png')
  505.                 ->setIsPro(false)
  506.                 ->setNotification(true)
  507.                 ->setActivated(false)
  508.                 ->setHasAccess(true)
  509.                 ->setStatus('online')
  510.                 ->setShowEmail(true)
  511.                 ->setShowPhone(true)
  512.                 ->setLanguage($this->request->getLocale());
  513.             try {
  514.                 $manager->persist($trainee);
  515.                 $manager->flush();
  516.             } catch (\Throwable $th) {
  517.                 $this->addFlash(
  518.                     'error',
  519.                     "Une erreur s'est produite. Veillez réessayer"
  520.                 );
  521.                 return $this->redirectToRoute('trainee_registration_informations');
  522.             }
  523.             if ($trainee->getNewsletter()) {
  524.                 $brevoService->createBrevoContact($trainee->getFirstname(), $trainee->getLastname(), $trainee->getEmail(), 'trainee');
  525.             }
  526.             //$toTrainee->confirmEmail($trainee);
  527.             return $this->redirectToRoute('trainee_activate_account', [
  528.                 'token' => $trainee->getToken()
  529.             ]);
  530.         }
  531.         return $this->render('front/registration/registration-trainee.html.twig', [
  532.             'form' => $form->createView(),
  533.             'sports' => $sports,
  534.             'userType' => $userType,
  535.             'step' => 5
  536.         ]);
  537.     }
  538.     #[Route(path'/activate-account/{token}'name'pro_activate_account')]
  539.     public function proVerifyEmail(Request $requestUserRepository $userRepo$tokenEntityManagerInterface $managerStripeService $stripeServiceTokenStorageInterface $tokenStorageToPro $toPro)
  540.     {
  541.         $user $userRepo->findOneBy(['token' => $token]);
  542.         if (!$user) {
  543.             return $this->redirectToRoute('homepage');
  544.         }
  545.         $stripeInfo = new StripeInfo;
  546.         $stripeCustomer $stripeService->createStripeCustomer($user);
  547.         $stripeAccount $stripeService->createStripeAccount($user);
  548.         $stripeInfo->setCustomerId($stripeCustomer->id)
  549.             ->setAccountId($stripeAccount->id);
  550.         $manager->persist($stripeInfo);
  551.         $user->setActivated(true)
  552.             ->setStripeInfo($stripeInfo)
  553.             ->setToken($this->generateString(32));
  554.         $manager->flush($user);
  555.         //$toPro->confirmEmail($pro);
  556.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  557.         $tokenStorage->setToken($token);
  558.         //$this->addFlash('welcome-registration', 'Bienvenue sur Racket Trip ! Votre compte a été activé avec succès. Vous pouvez maintenant profiter de toutes les fonctionnalités.');
  559.         return $this->redirectToRoute('membership', [
  560.             'type' => $user->getProType(),
  561.         ]);
  562.     }
  563.     #[Route(path'/activate-trainee-account/{token}'name'trainee_activate_account')]
  564.     public function traineeVerifyEmail(UserRepository $userRepo$tokenTokenStorageInterface $tokenStorageEntityManagerInterface $managerNoteRequestRepository $noteRequestRepository)
  565.     {
  566.         $user $userRepo->findOneBy(['token' => $token]);
  567.         if (!$user) {
  568.             return $this->redirectToRoute('homepage');
  569.         }
  570.         $user->setActivated(true)
  571.             ->setToken($this->generateString(32));
  572.         $manager->flush($user);
  573.         $token = new UsernamePasswordToken($usernull'main'$user->getRoles());
  574.         $tokenStorage->setToken($token);
  575.         $this->addFlash('welcome-registration''Bienvenue sur Racket Trip ! Votre compte a été activé avec succès. Vous pouvez maintenant profiter de toutes les fonctionnalités.');
  576.         if ($noteRequestRepository->findOneBy(['email' => $user->getEmail(), 'status' => 'pending'])) {
  577.             $this->addFlash(
  578.                 'success',
  579.                 "Votre compte a été activé avec succès. Vous pouvez maintenant reserver des stages. Vous avez une demande de notation en attente."
  580.             );
  581.             return $this->redirectToRoute('trainee_note_pending');
  582.         }
  583.         return $this->redirectToRoute('homepage');
  584.     }
  585.     /*
  586.     #[Route(path: '/registration-informations', name: 'registration_informations')]
  587.     public function proRegistrationInformations(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  588.     {
  589.         $user = $this->getUser();
  590.         if ($user != null) {
  591.             return $this->redirectToRoute('homepage');
  592.         }
  593.         $timeZone = $this->internationalService->findVisitorTimeZone();
  594.         $session = $request->getSession();
  595.         $userType = $session->get('userType');
  596.         $email = $session->get('registrationEmail');
  597.         $password = $session->get('registrationPassword');
  598.         $phone = $session->get('registrationPhone');
  599.         if ($userType == null || $email == null || $password == null || $phone == null) {
  600.             return $this->redirectToRoute('pro_registration_type');
  601.         }
  602.         if ($userType == 'coach') {
  603.             $pro = new Coach();
  604.             $form = $this->createForm(CoachRegisterType::class, $pro);
  605.         }
  606.         if ($userType == 'club') {
  607.             $pro = new Club();
  608.             $form = $this->createForm(ClubRegisterType::class, $pro);
  609.         }
  610.         if ($userType == 'operator') {
  611.             $pro = new Operator();
  612.             $form = $this->createForm(OperatorRegisterType::class, $pro);
  613.         }
  614.         $form->handleRequest($request);
  615.         
  616.         $slugger = new AsciiSlugger();
  617.         if ($form->isSubmitted() && $form->isValid()) {
  618.             $hashed = $passwordHasher->hashPassword($pro, $password);
  619.             $proInfo = $pro->getProInfo();
  620.             $proInfo->setFullname($pro->getFirstname() . ' ' . $pro->getLastname())
  621.                 ->setPageVisible(false)
  622.                 ->setCoverPhoto('cover.png')
  623.                 ->setHaveSubscription(false)
  624.                 ->setContactEmail($email);
  625.             $sports = $proInfo->getSports();
  626.             foreach ($sports as $sport) {
  627.                 $sport->addPro($proInfo);
  628.                 $manager->persist($sport);
  629.             }
  630.             $slug = strtolower($slugger->slug($pro->getFirstname() . '-' . $pro->getLastname() . '-' . rand(10000, 98765)));
  631.             $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  632.             $pro->setRegisteredAt(new DateTime())
  633.                 ->setToken($this->generateString(32))
  634.                 ->setTimezone($timeZone)
  635.                 ->addUserRole($role)
  636.                 ->setIsPro(true)
  637.                 ->setPhoto('default-profile.png')
  638.                 ->setSlug($slug)
  639.                 ->setNotification(true)
  640.                 ->setActivated(false)
  641.                 ->setHasAccess(false)
  642.                 ->setPassword($hashed)
  643.                 ->setStatus('online')
  644.                 ->setLanguage($this->request->getLocale());
  645.             $coachInfo = new CoachInfo();
  646.             $coachInfo->setOwner($pro)
  647.                 ->setName($proInfo->getFullname())
  648.                 ->setAddress($pro->getAddress());
  649.             try {
  650.                 $manager->persist($proInfo);
  651.                 $manager->persist($pro);
  652.                 $manager->persist($coachInfo);
  653.                 $manager->flush();
  654.                 
  655.             } catch (\Throwable $th) {
  656.                 $this->addFlash(
  657.                     'success',
  658.                     "Une erreur s'est produite. Veillez réessayer"
  659.                 );
  660.                 return $this->redirectToRoute('coach_register');
  661.             }
  662.             if ($pro->getNewsletter()) {
  663.                 $this->brevoService->createBrevoContact($pro->getFirstname(), $pro->getLastname(), $pro->getEmail(), 'pro');
  664.             }
  665.             $toPro->confirmEmail($pro);
  666.             $this->addFlash(
  667.                 'registration',
  668.                 ""
  669.             );
  670.             return $this->redirectToRoute('homepage');
  671.             
  672.         }
  673.         return $this->render('front/pro/registration/coach-registration.html.twig', [
  674.             'form' => $form->createView(),
  675.             'type' => 'coach'
  676.         ]);
  677.     }
  678.         
  679.     #[Route(path: '/coach-registration', name: 'coach_register')]
  680.     public function coachRegistration(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  681.     {
  682.         $user = $this->getUser();
  683.         if ($user != null) {
  684.             return $this->redirectToRoute('homepage');
  685.         }
  686.         $timeZone = $this->internationalService->findVisitorTimeZone();
  687.         $coach = new Coach();
  688.         $slugger = new AsciiSlugger();
  689.         $form = $this->createForm(CoachRegisterType::class, $coach);
  690.         $form->handleRequest($request);
  691.         if ($form->isSubmitted() && $form->isValid()) {
  692.             if ($userRepository->findOneBy(['email' => $coach->getEmail()])) {
  693.                 $form->get('email')->addError(new FormError("Un compte existe avec cet email"));
  694.             } else {
  695.                 $password = $coach->getPassword();
  696.                 $hashed = $passwordHasher->hashPassword($coach, $password);
  697.                 $proInfo = $coach->getProInfo();
  698.                 $proInfo->setFullname($coach->getFirstname() . ' ' . $coach->getLastname())
  699.                     ->setPageVisible(false)
  700.                     ->setCoverPhoto('cover.png')
  701.                     ->setHaveSubscription(false)
  702.                     ->setContactEmail($coach->getEmail());
  703.                 $sports = $proInfo->getSports();
  704.                 foreach ($sports as $sport) {
  705.                     $sport->addPro($proInfo);
  706.                     $manager->persist($sport);
  707.                 }
  708.                 $slug = strtolower($slugger->slug($coach->getFirstname() . '-' . $coach->getLastname() . '-' . rand(10000, 98765)));
  709.                 $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  710.                 $coach->setRegisteredAt(new DateTime())
  711.                     ->setToken($this->generateString(32))
  712.                     ->setTimezone($timeZone)
  713.                     ->addUserRole($role)
  714.                     ->setIsPro(true)
  715.                     ->setPhoto('default-profile.png')
  716.                     ->setSlug($slug)
  717.                     ->setNotification(true)
  718.                     ->setActivated(false)
  719.                     ->setHasAccess(false)
  720.                     ->setPassword($hashed)
  721.                     ->setStatus('online')
  722.                     ->setLanguage($this->request->getLocale());
  723.                 $coachInfo = new CoachInfo();
  724.                 $coachInfo->setOwner($coach)
  725.                     ->setName($proInfo->getFullname())
  726.                     ->setAddress($coach->getAddress());
  727.                 try {
  728.                     $manager->persist($proInfo);
  729.                     $manager->persist($coach);
  730.                     $manager->persist($coachInfo);
  731.                     $manager->flush();
  732.                     
  733.                 } catch (\Throwable $th) {
  734.                     $this->addFlash(
  735.                         'success',
  736.                         "Une erreur s'est produite. Veillez réessayer"
  737.                     );
  738.                     return $this->redirectToRoute('coach_register');
  739.                 }
  740.                 if ($coach->getNewsletter()) {
  741.                     $this->brevoService->createBrevoContact($coach->getFirstname(), $coach->getLastname(), $coach->getEmail(), 'pro');
  742.                 }
  743.                 $toPro->confirmEmail($coach);
  744.                 $this->addFlash(
  745.                     'registration',
  746.                     ""
  747.                 );
  748.                 return $this->redirectToRoute('homepage');
  749.             }
  750.         }
  751.         return $this->render('front/pro/registration/coach-registration.html.twig', [
  752.             'form' => $form->createView(),
  753.             'type' => 'coach'
  754.         ]);
  755.     }
  756.     #[Route(path: '/club-registration', name: 'club_register')]
  757.     public function clubRegister(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  758.     {
  759.         $user = $this->getUser();
  760.         if ($user != null) {
  761.             return $this->redirectToRoute('homepage');
  762.         }
  763.         $timeZone = $this->internationalService->findVisitorTime();
  764.         $club = new Club();
  765.         $slugger = new AsciiSlugger();
  766.         $form = $this->createForm(ClubRegisterType::class, $club);
  767.         $form->handleRequest($request);
  768.         if ($form->isSubmitted() && $form->isValid()) {
  769.             if ($userRepository->findOneBy(['email' => $club->getEmail()])) {
  770.                 $form->get('email')->addError(new FormError("Un compte existe avec cet email"));
  771.             } else {
  772.                 $password = $club->getPassword();
  773.                 $hashed = $passwordHasher->hashPassword($club, $password);
  774.                 $proInfo = $club->getProInfo();
  775.                 $proInfo->setFullname($club->getClubInfo()->getName())
  776.                     ->setPageVisible(false)
  777.                     ->setCoverPhoto('cover.png')
  778.                     ->setContactEmail($club->getEmail());
  779.                 $sports = $proInfo->getSports();
  780.                 foreach ($sports as $sport) {
  781.                     $sport->addPro($proInfo);
  782.                     $availability = new Availability();
  783.                     $availability->setSport($sport)
  784.                         ->setClub($club);
  785.                     $manager->persist($availability);
  786.                     $manager->persist($club);
  787.                     $manager->persist($sport);
  788.                 }
  789.                 $slug = strtolower($slugger->slug($club->getClubInfo()->getName() . '-' . rand(10000, 98765)));
  790.                 $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  791.                 $club->setRegisteredAt(new DateTime())
  792.                     ->setToken($this->generateString(32))
  793.                     ->setIsPro(true)
  794.                     ->addUserRole($role)
  795.                     ->setTimezone($timeZone)
  796.                     ->setPhoto('default-profile.png')
  797.                     ->setSlug($slug)
  798.                     ->setNotification(true)
  799.                     ->setActivated(false)
  800.                     ->setHasAccess(false)
  801.                     ->setPassword($hashed)
  802.                     ->setStatus('online')
  803.                     ->setLanguage($this->request->getLocale());
  804.                 $clubInfo = $club->getClubInfo();
  805.                 $clubInfo->setOwner($club)
  806.                     ->setName($proInfo->getFullname())
  807.                     ->setAddress($club->getAddress());
  808.                 try {
  809.                     $manager->persist($proInfo);
  810.                     $manager->persist($club);
  811.                     $manager->persist($clubInfo);
  812.                     $manager->flush();
  813.                 } catch (\Throwable $th) {
  814.                     $this->addFlash(
  815.                         'success',
  816.                         "Une erreur s'est produite. Veillez réessayer"
  817.                     );
  818.                     return $this->redirectToRoute('club_register');
  819.                 }
  820.                 if ($club->getNewsletter()) {
  821.                     $this->brevoService->createBrevoContact($club->getFirstname(), $club->getLastname(), $club->getEmail(), 'pro');
  822.                 }
  823.                 $toPro->confirmEmail($club);
  824.                 $this->addFlash(
  825.                     'registration',
  826.                     ""
  827.                 );
  828.                 return $this->redirectToRoute('homepage');
  829.             }
  830.         }
  831.         return $this->render('front/pro/registration/club-registration.html.twig', [
  832.             'form' => $form->createView(),
  833.             'type' => 'club'
  834.         ]);
  835.     }
  836.     #[Route(path: '/operator-registration', name: 'operator_register')]
  837.     public function operatorRegister(Request $request, EntityManagerInterface $manager, RoleRepository $roleRepository, UserPasswordHasherInterface $passwordHasher, ToPro $toPro, UserRepository $userRepository)
  838.     {
  839.         $user = $this->getUser();
  840.         if ($user != null) {
  841.             return $this->redirectToRoute('homepage');
  842.         }
  843.         $timeZone = $this->internationalService->findVisitorTimeZone();
  844.         $operator = new Operator();
  845.         $slugger = new AsciiSlugger();
  846.         $form = $this->createForm(OperatorRegisterType::class, $operator);
  847.         $form->handleRequest($request);
  848.         if ($form->isSubmitted() && $form->isValid()) {
  849.             if ($userRepository->findOneBy(['email' => $operator->getEmail()])) {
  850.                 $form->get('email')->addError(new FormError("Un compte existe avec cet email"));
  851.             } else {
  852.                 $password = $operator->getPassword();
  853.                 $hashed = $passwordHasher->hashPassword($operator, $password);
  854.                 $proInfo = $operator->getProInfo();
  855.                 $proInfo->setFullname($operator->getOperatorInfo()->getName())
  856.                     ->setPageVisible(false)
  857.                     ->setCoverPhoto('cover.png')
  858.                     ->setContactEmail($operator->getEmail());
  859.                 $sports = $proInfo->getSports();
  860.                 foreach ($sports as $sport) {
  861.                     $sport->addPro($proInfo);
  862.                     $manager->persist($sport);
  863.                 }
  864.                 $slug = strtolower($slugger->slug($operator->getOperatorInfo()->getName() . '-' . rand(10000, 98765)));
  865.                 $role = $roleRepository->findOneBy(['title' => 'ROLE_PRO']);
  866.                 $operator->setRegisteredAt(new DateTime())
  867.                     ->setToken($this->generateString(32))
  868.                     ->addUserRole($role)
  869.                     ->setIsPro(true)
  870.                     ->setSlug($slug)
  871.                     ->setPhoto('default-profile.png')
  872.                     ->setTimezone($timeZone)
  873.                     ->setNotification(true)
  874.                     ->setActivated(false)
  875.                     ->setPassword($hashed)
  876.                     ->setHasAccess(false)
  877.                     ->setStatus('online')
  878.                     ->setLanguage($this->request->getLocale());
  879.                 $operatorInfo = $operator->getOperatorInfo();
  880.                 $operatorInfo->setOwner($operator);
  881.                 $proInfo->setFullname($operatorInfo->getName())
  882.                     ->setContactEmail($operator->getEmail());
  883.                 try {
  884.                     $manager->persist($proInfo);
  885.                     $manager->persist($operator);
  886.                     $manager->persist($operatorInfo);
  887.                     $manager->flush();
  888.                 } catch (\Throwable $th) {
  889.                     $this->addFlash(
  890.                         'success',
  891.                         "Une erreur s'est produite. Veillez réessayer"
  892.                     );
  893.                     return $this->redirectToRoute('operator_register');
  894.                 }
  895.                 if ($operator->getNewsletter()) {
  896.                     $this->brevoService->createBrevoContact($operator->getFirstname(), $operator->getLastname(), $operator->getEmail(), 'pro');
  897.                 }
  898.                 $toPro->confirmEmail($operator);
  899.                 $this->addFlash(
  900.                     'registration',
  901.                     ""
  902.                 );
  903.                 return $this->redirectToRoute('homepage');
  904.             }
  905.         }
  906.         return $this->render('front/pro/registration/operator-registration.html.twig', [
  907.             'form' => $form->createView(),
  908.             'type' => 'operator'
  909.         ]);
  910.     }
  911.     */
  912. }