src/Controller/Security/SecurityController.php line 97

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Security;
  3. use App\Ressources\FakeData;
  4. use App\Entity\Security\User;
  5. use App\Form\Security\LoginFormType;
  6. use App\Service\SmsGeneratorService;
  7. use App\Service\UwandzaniApiService;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use App\Service\Security\SecurityService;
  10. use App\Form\Security\RegistrationFormType;
  11. use App\Repository\Security\UserRepository;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use App\Services\Notification\NotificationMailService;
  18. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  21. use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
  22. final class SecurityController extends AbstractController
  23. {
  24.     private EntityManagerInterface $em;
  25.     private UserPasswordHasherInterface $passwordHasher;
  26.     private FakeData $fakeData;
  27.     private JWTTokenManagerInterface $JWTTokenManager;
  28.     private UwandzaniApiService $uwandzaniApiService;
  29.     private SmsGeneratorService $smsGenerator;
  30.     private CsrfTokenManagerInterface $csrfTokenManager;
  31.     private UserRepository $userRepository;
  32.     private SecurityService $securityService;
  33.     //private NotificationMailService $notificationMailService;
  34.     public const SCOPES = [
  35.         'google' => [],
  36.         'facebook' => [
  37.             'email',
  38.             'public_profile',
  39.             'user_friends',
  40.             'pages_show_list',
  41.             'phone',
  42.             'pages_read_engagement',
  43.             'pages_manage_metadata',
  44.             'pages_read_user_content',
  45.             'pages_manage_ads',
  46.             'pages_manage_engagement',
  47.             'pages_manage_posts',
  48.             'pages_manage_read',
  49.             'pages_manage_comments',
  50.             'pages_manage_jobs',
  51.             'pages_manage_leads',
  52.         ],
  53.         'apple' => [],
  54.         'instagram' => [],
  55.         'uber' => [],
  56.         'phone' => [],
  57.         'email' => [],
  58.     ];
  59.     public function __construct(
  60.         EntityManagerInterface $em,
  61.         UserPasswordHasherInterface $passwordHasher,
  62.         FakeData $fakeData,
  63.         JWTTokenManagerInterface $JWTTokenManager,
  64.         UwandzaniApiService $uwandzaniApiService,
  65.         SmsGeneratorService $smsGenerator,
  66.         CsrfTokenManagerInterface $csrfTokenManager,
  67.         UserRepository $userRepository,
  68.         SecurityService $securityService
  69.     ) {
  70.         $this->em $em;
  71.         $this->passwordHasher $passwordHasher;
  72.         $this->fakeData $fakeData;
  73.         $this->JWTTokenManager $JWTTokenManager;
  74.         $this->uwandzaniApiService $uwandzaniApiService;
  75.         $this->smsGenerator $smsGenerator;
  76.         $this->csrfTokenManager $csrfTokenManager;
  77.         $this->userRepository $userRepository;
  78.         $this->securityService $securityService;
  79.         //$this->notificationMailService = $notificationMailService;
  80.     }
  81.     /******************************
  82.      *  Affiche le formulaire web
  83.      * de connexion
  84.      * Et le formulaire web
  85.      * d'inscription
  86.      * ***************************/
  87.     /**
  88.      * @Route("/", name="app_login", methods={"GET", "POST"})
  89.      * @Route("/app-registration", name="app_home_regisatration", methods={"GET", "POST"})
  90.      */
  91.     public function homePage(
  92.         Request $request,
  93.         EntityManagerInterface $em,
  94.         UserPasswordHasherInterface $passwordHasher
  95.     ): Response {
  96.         if ($this->getUser()) {
  97.             return $this->redirectToRoute('app_project_project_task_position_index');
  98.         }
  99.         // Créer les formulaires sans passer manuellement le jeton CSRF
  100.         $loginForm $this->createForm(LoginFormType::class);
  101.         $registrationForm $this->createForm(RegistrationFormType::class);
  102.         $loginForm->handleRequest($request);
  103.         $registrationForm->handleRequest($request);
  104.         // Traiter l'enregistrement
  105.         if ($registrationForm->isSubmitted() && $registrationForm->isValid()) {
  106.             $data $registrationForm->getData();
  107.             $user = new User();
  108.             $user->setEmail($data['email']);
  109.             // Hachage du mot de passe
  110.             $hashedPassword $passwordHasher->hashPassword(
  111.                 $user,
  112.                 $data['password']
  113.             );
  114.             $user->setPassword($hashedPassword);
  115.             // Enregistrer l'utilisateur dans la base de données
  116.             $em->persist($user);
  117.             $em->flush();
  118.             $this->addFlash('success''Inscription réussie !');
  119.             // Rediriger l'utilisateur après inscription réussie
  120.             return $this->redirectToRoute('app_home_project_index');
  121.         }
  122.         return $this->render('security/home.html.twig', [
  123.             'form_login' => $loginForm->createView(),
  124.             'form_registration' => $registrationForm->createView(),
  125.         ]);
  126.     }
  127.     /////////////////////////// Login //////////////////////////
  128.     /******************************
  129.      * Authentification de l'utilisateur
  130.      * à partir du web
  131.      ***************************/
  132.     /**
  133.      * @Route("/auth/login", name="login", methods={"GET"})
  134.      */
  135.     public function loginFromWeb(): Response
  136.     {
  137.         if ($this->getUser()) {
  138.             return $this->redirectToRoute('home');
  139.         }
  140.         return $this->render('security/login.html.twig');
  141.     }
  142.     /******************************
  143.      * Récupère l'identifiant Authentification de l'utilisateur
  144.      * à partir de l'API
  145.      * 
  146.      * Si l'utilisateur n'existe pas, il est créé
  147.      * et un code de vérification est envoyé
  148.      ***************************/
  149.     /**
  150.      * @Route("/get-login-identifier-from-api", name="api_get_login_identifier_from_api", methods={"POST"})
  151.      */
  152.     public function createAndLoginFromApi(Request $requestUserRepository $userRepository): JsonResponse
  153.     {
  154.         $user null;
  155.         $data json_decode($request->getContent(), true);
  156.         $isUwandzaniIdentifier $data['isUwandzaniIdentifier'] ?? false;
  157.         $identifier $data['identifier'] ?? null;
  158.         $identifierType $data['identifierType'] ?? null;
  159.         $hashSMS $data['hashSMS'] ?? null;
  160.         $plainPassword $data['password'] ?? null;
  161.         /***********************
  162.          * Vérifie si l'utilisateur existe
  163.          * ************************/
  164.         if ($identifier) {
  165.             $user $this->findUserByCredentials($identifier);
  166.         }
  167.         // Si l'utilisateur n'est pas trouvé, on crée l'utilisateur
  168.         if (!$user && array_key_exists($identifierTypeself::SCOPES) && !$isUwandzaniIdentifier) {
  169.             $user =  $this->createUser($identifier$identifierType$hashSMS$plainPassword);
  170.             //$sendVerificationCode = false;
  171.         }
  172.         if ($isUwandzaniIdentifier) {
  173.             $uwandzaniCredantials $this->uwandzaniApiService->retreiveUwandzaniCredantials(
  174.                 $identifier,
  175.                 $identifierType,
  176.                 $plainPassword,
  177.                 $hashSMS
  178.             );
  179.             $this->findOrCreateUserWithUwandzani([
  180.                 'uwandzaniId' => $uwandzaniCredantials['uwandzaniId'],
  181.                 'identifier' => $uwandzaniCredantials['identifier'],
  182.                 'identifierType' => $uwandzaniCredantials['identifierType'],
  183.                 'hashSMS' => $uwandzaniCredantials['hashSMS'],
  184.                 'plainPassword' => $uwandzaniCredantials['plainPassword'],
  185.             ], $userRepository);
  186.             if (!$user) {
  187.                 return new JsonResponse(['message' => 'Code de validation incorrect ou utilisateur non trouvé.'], 401);
  188.             }
  189.         } elseif ($identifierType === self::SCOPES['phone']) {
  190.             if ($identifier !== '+33782615889') {
  191.                 // On continue
  192.             } elseif (
  193.                 $identifierType === self::SCOPES['phone']
  194.             ) {
  195.                 $this->generateVerificationCode($user$hashSMS$identifierType);
  196.             }
  197.         } elseif ($identifierType === self::SCOPES['email']) {
  198.             /***
  199.              * On vérifie que le mot de passe entrée 
  200.              * Corespond à celui de l'utilisateur
  201.              * Si c'est le cas, on continue
  202.              */
  203.             if ($plainPassword) {
  204.                 if (!$this->passwordHasher->isPasswordValid($user$plainPassword)) {
  205.                     return new JsonResponse(['message' => 'Au mo'], 401);
  206.                 }
  207.             }
  208.         } elseif ($identifierType === self::SCOPES['google']) {
  209.             // code...
  210.         } elseif ($identifierType === self::SCOPES['facebook']) {
  211.             // code...
  212.         } elseif ($identifierType === self::SCOPES['apple']) {
  213.             // code...
  214.         } elseif ($identifierType === self::SCOPES['instagram']) {
  215.             // code...
  216.         } elseif ($identifierType === self::SCOPES['uber']) {
  217.             // code...
  218.         }
  219.         /***********************
  220.          * Si c'est une identification par Uwandzani
  221.          * On lui renvoie seulement l'identifiant public
  222.          * 
  223.          * Ensuitel'application cliente devra générer son jeton
  224.          * d'authentification pour l'utilisateur
  225.          ***********************/
  226.         if ($user && $isUwandzaniIdentifier) {
  227.             return new JsonResponse(
  228.                 ['uwandzaniId' => $user->getUuid()],
  229.                 200
  230.             );
  231.         }
  232.         if (!$user) {
  233.             return new JsonResponse(['message' => 'Aucun moyen de connexion valide fourni.'], 400);
  234.         }
  235.         /**********************
  236.          * Si l'utilisateur est trouvé
  237.          * Et que ce n'est pas une athentification par Uwandzani
  238.          * On lui envoie un code de vérification
  239.          **************************/
  240.         $token $this->securityService->createAndUpdateJwtToken($user);
  241.         return new JsonResponse([
  242.             'message' => 'Connexion réussie',
  243.             'token' => $token,
  244.             'user' => [
  245.                 'uuid' => $user->getUuid(),
  246.                 'email' => $user->getEmail(),
  247.             ]
  248.         ], 200);
  249.     }
  250.     // $recaptchaResponse = $request->get('recaptcha-response');
  251.     //     if ($form->isSubmitted() && $form->isValid() && $this->isNotRobot($recaptchaResponse)) {
  252.     /******************************
  253.      * Verifie le code de vérification
  254.      * de l'utilisateur
  255.      * 
  256.      * Si le code est correct, l'utilisateur
  257.      * est vérifié et un jeton d'authentification
  258.      * est généré et renvoyé au client
  259.      * Pour être connécté coté client
  260.      * ***************************/
  261.     /**
  262.      * @Route("/chek-verification-code", name="chek_verification_code", methods={"POST"})
  263.      */
  264.     public function chekVerificationCode(Request $request): JsonResponse
  265.     {
  266.         $data json_decode($request->getContent(), true);
  267.         $identifier $data['identifier'] ?? null;
  268.         $verificationCode $data['verificationCode'] ?? null;
  269.         $identifierType $data['identifierType'] ?? null;
  270.         $hashSMS $data['hashSMS'] ?? null;
  271.         $plainPassword $data['password'] ?? null;
  272.         $user null;
  273.         if ($identifier) {
  274.             $user $this->findUserByCredentials($identifier);
  275.         }
  276.         if ($user && $verificationCode && $user->getVerificationCode() === $verificationCode && ((new \DateTime('now')) > $user->getVerificationCodeExpiresdAt())) {
  277.             $token $this->securityService->createAndUpdateJwtToken($user);
  278.             $user
  279.                 ->setIsVerified(true)
  280.                 ->setVerificationCode(null);
  281.             $this->em->flush();
  282.             return new JsonResponse([
  283.                 'message' => 'Code de validation correct',
  284.                 'authToken' => $token,
  285.                 'user' => [
  286.                     'uuid' => $user->getUuid(),
  287.                     'email' => $user->getEmail(),
  288.                 ]
  289.             ], 200);
  290.         }
  291.         return new JsonResponse(['message' => 'Code incorrect ou expiré'], 401);
  292.     }
  293.     /******************************
  294.      * Rafraîchir le jeton d'authentification
  295.      * de l'utilisateur
  296.      * ***************************/
  297.     /**
  298.      * @Route("/api/pr/s/u/refresh-token", name="api_user_refresh_token", methods={"GET"})
  299.      */
  300.     public function refreshJwtToken(): JsonResponse
  301.     {
  302.         /** @var User $user */
  303.         $user $this->getUser();
  304.         if (!$user) {
  305.             return new JsonResponse(['message' => 'Utilisateur non authentifié.'], 401);
  306.         }
  307.         $token $this->securityService->createAndUpdateJwtToken($user);
  308.         return new JsonResponse([
  309.             'message' => 'Token rafraîchi avec succès',
  310.             'token' => $token,
  311.             'user' => $user->getUuid()
  312.         ]);
  313.     }
  314.     /*******************************************
  315.      * Créer un utilisateur avec réseau sociaux
  316.      *******************************************/
  317.     /***
  318.      * Créer un utilisateur avec un
  319.      * ID Uwandzani
  320.      ***/
  321.     private function findOrCreateUserWithUwandzani(array $uwandzaniCredantialsUserRepository $userRepository): Response
  322.     {
  323.         $identifier $uwandzaniCredantials['identifier'] ?? null;
  324.         $identifierType $uwandzaniCredantials['identifierType'] ?? null;
  325.         // $plainPassword = $uwandzaniCredantials['plainPassword'] ?? null;
  326.         $hashSMS $uwandzaniCredantials['hashSMS'] ?? null;
  327.         $uwandzaniId $uwandzaniCredantials['uwandzaniId'];
  328.         $user $userRepository->findOneBy(['uwandzaniId' => $uwandzaniId]);
  329.         // Si l'utilisateur n'est pas trouvé, on crée l'utilisateur
  330.         if (!$user) {
  331.             $user =  $this->createUser($identifier$identifierType$hashSMS);
  332.         }
  333.         /**********************
  334.          * Si l'utilisateur est trouvé
  335.          * Et que ce n'est pas une athentification par Uwandzani
  336.          * On lui envoie un code de vérification
  337.          **************************/
  338.         $token $this->securityService->createAndUpdateJwtToken($user);
  339.         return new JsonResponse([
  340.             'message' => 'Connexion réussie',
  341.             'token' => $token,
  342.             'user' => [
  343.                 'uuid' => $user->getUuid(),
  344.                 'email' => $user->getEmail(),
  345.             ]
  346.         ], 200);
  347.         return new JsonResponse(['message' => 'Utilisateur créé avec succès''uuid' => $user->getUuid()], 201);
  348.     }
  349.     /***********************************
  350.      * Créer un utilisateur avec un 
  351.      * ID Facebook
  352.      ********************************/
  353.     /**
  354.      * @Route("/pu/s/u/create-user/facebook", name="api_create_user_with_facebook", methods={"POST"})
  355.      */
  356.     public function createUserWithFacebook(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  357.     {
  358.         if ($request->get('_route') === 'api_create_fake_users_with_facebook') {
  359.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  360.             if ($fakeUsers) {
  361.                 return $this->redirectToRoute(
  362.                     'app_security_user_delete_fake_users',
  363.                     ["nextRoute" => "api_create_fake_users_with_facebook"]
  364.                 );
  365.             }
  366.             $userFakes $this->fakeData->getUserFakeData();
  367.             $createdUsers $this->createFakeUsersWithFacebook($userFakes);
  368.             return new JsonResponse([
  369.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  370.                 'created_users' => $createdUsers,
  371.             ], 201);
  372.         }
  373.         $client $clientRegistry->getClient('facebook');
  374.         $userInfo $client->fetchUser();
  375.         // On vérifie si l'utilisateur existe déjà
  376.         $facebookId $userInfo->getId();
  377.         $user $userRepository->findOneBy(['facebookId' => $facebookId]);
  378.         if (!$user) {
  379.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  380.             $user $this->createUserWithCredentials(
  381.                 $email null,
  382.                 $phone null,
  383.                 $hashSMS null,
  384.                 $uwandzaniToken null,
  385.                 $facebookId,
  386.                 $googleId null,
  387.                 $appleId null,
  388.                 $isForFake false,
  389.                 $userData = []
  390.             );
  391.         }
  392.         return new JsonResponse([
  393.             'message' => 'Utilisateur Facebook créé avec succès',
  394.             'uuid' => $user->getUuid(),
  395.         ], 201);
  396.     }
  397.     /***********************************
  398.      * Créer un utilisateur avec un 
  399.      * ID Google
  400.      **********************************/
  401.     /**
  402.      * @Route("/pu/s/u/create-user/google", name="api_create_user_with_google", methods={"POST"})
  403.      */
  404.     public function createUserWithGoogle(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  405.     {
  406.         if ($request->get('_route') === 'api_create_fake_users_with_google') {
  407.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  408.             if ($fakeUsers) {
  409.                 return $this->redirectToRoute(
  410.                     'app_security_user_delete_fake_users',
  411.                     ["nextRoute" => "api_create_fake_users_with_google"]
  412.                 );
  413.             }
  414.             $userFakes $this->fakeData->getUserFakeData();
  415.             $createdUsers $this->createFakeUsersWithGoogle($userFakes);
  416.             return new JsonResponse([
  417.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  418.                 'created_users' => $createdUsers,
  419.             ], 201);
  420.         }
  421.         $client $clientRegistry->getClient('google');
  422.         $userInfo $client->fetchUser();
  423.         $googleId $userInfo->getId();
  424.         $user $userRepository->findOneBy(['googleId' => $googleId]);
  425.         if (!$user) {
  426.             $user $this->createUserWithCredentials(
  427.                 $email null,
  428.                 $phone null,
  429.                 $hashSMS null,
  430.                 $uwandzaniToken null,
  431.                 $facebookId null,
  432.                 $googleId,
  433.                 $appleId null,
  434.                 $isForFake false,
  435.                 $userData = []
  436.             );
  437.         }
  438.         return new JsonResponse([
  439.             'message' => 'Utilisateur Google créé avec succès',
  440.             'uuid' => $user->getUuid(),
  441.         ], 201);
  442.     }
  443.     /*********************************
  444.      * Créer un utilisateur avec un 
  445.      * ID Apple
  446.      ********************************/
  447.     /**
  448.      * @Route("/pu/s/u/create-user/apple", name="api_create_user_with_apple", methods={"POST"})
  449.      */
  450.     public function createUserWithApple(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  451.     {
  452.         if ($request->get('_route') === 'api_create_fake_users_with_apple') {
  453.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  454.             if ($fakeUsers) {
  455.                 return $this->redirectToRoute(
  456.                     'app_security_user_delete_fake_users',
  457.                     ["nextRoute" => "api_create_fake_users_with_apple"]
  458.                 );
  459.             }
  460.             $userFakes $this->fakeData->getUserFakeData();
  461.             $createdUsers $this->createFakeUsersWithApple($userFakes);
  462.             return new JsonResponse([
  463.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  464.                 'created_users' => $createdUsers,
  465.             ], 201);
  466.         }
  467.         $client $clientRegistry->getClient('apple');
  468.         $userInfo $client->fetchUser();
  469.         $appleId $userInfo->getId();
  470.         $user $userRepository->findOneBy(['appleId' => $appleId]);
  471.         if (!$user) {
  472.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  473.             $user $this->createUserWithCredentials(
  474.                 $email null,
  475.                 $phone null,
  476.                 $hashSMS null,
  477.                 $uwandzaniToken null,
  478.                 $facebookId null,
  479.                 $googleId null,
  480.                 $appleId,
  481.                 $isForFake false,
  482.                 $userData = []
  483.             );
  484.         }
  485.         return new JsonResponse([
  486.             'message' => 'Utilisateur Apple créé avec succès',
  487.             'uuid' => $user->getUuid(),
  488.         ], 201);
  489.     }
  490.     /**************************************
  491.      * Créer un utilisateur avec un 
  492.      * ID Instagram
  493.      ************************************/
  494.     /**
  495.      * @Route("/pu/s/u/create-user/instagram", name="api_create_user_with_instagram", methods={"POST"})
  496.      */
  497.     public function createUserWithInstagram(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  498.     {
  499.         if ($request->get('_route') === 'api_create_fake_users_with_instagram') {
  500.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  501.             if ($fakeUsers) {
  502.                 return $this->redirectToRoute(
  503.                     'app_security_user_delete_fake_users',
  504.                     ["nextRoute" => "api_create_fake_users_with_instagram"]
  505.                 );
  506.             }
  507.             $userFakes $this->fakeData->getUserFakeData();
  508.             $createdUsers $this->createFakeUsersWithInstagram($userFakes);
  509.             return new JsonResponse([
  510.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  511.                 'created_users' => $createdUsers,
  512.             ], 201);
  513.         }
  514.         $client $clientRegistry->getClient('instagram');
  515.         $userInfo $client->fetchUser();
  516.         $instagramId $userInfo->getId();
  517.         $user $userRepository->findOneBy(['instagramId' => $instagramId]);
  518.         if (!$user) {
  519.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  520.             $user $this->createUserWithCredentials(
  521.                 $email null,
  522.                 $phone null,
  523.                 $hashSMS null,
  524.                 $uwandzaniToken null,
  525.                 $facebookId null,
  526.                 $googleId null,
  527.                 $appleId null,
  528.                 $isForFake false,
  529.                 $userData = []
  530.             );
  531.             $user->setInstagramId($instagramId);
  532.             $this->em->flush();
  533.         }
  534.         return new JsonResponse([
  535.             'message' => 'Utilisateur Instagram créé avec succès',
  536.             'uuid' => $user->getUuid(),
  537.         ], 201);
  538.     }
  539.     /**********************************
  540.      * Créer un utilisateur avec un 
  541.      * ID TikTok
  542.      *********************************/
  543.     /**
  544.      * @Route("/pu/s/u/create-user/tiktok", name="api_create_user_with_tiktok", methods={"POST"})
  545.      */
  546.     public function createUserWithTikTok(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  547.     {
  548.         if ($request->get('_route') === 'api_create_fake_users_with_tiktok') {
  549.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  550.             if ($fakeUsers) {
  551.                 return $this->redirectToRoute(
  552.                     'app_security_user_delete_fake_users',
  553.                     ["nextRoute" => "api_create_fake_users_with_tiktok"]
  554.                 );
  555.             }
  556.             $userFakes $this->fakeData->getUserFakeData();
  557.             $createdUsers $this->createFakeUsersWithTikTok($userFakes);
  558.             return new JsonResponse([
  559.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  560.                 'created_users' => $createdUsers,
  561.             ], 201);
  562.         }
  563.         $client $clientRegistry->getClient('tiktok');
  564.         $userInfo $client->fetchUser();
  565.         $tiktokId $userInfo->getId();
  566.         $user $userRepository->findOneBy(['tiktokId' => $tiktokId]);
  567.         if (!$user) {
  568.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  569.             $user $this->createUserWithCredentials(
  570.                 $email null,
  571.                 $phone null,
  572.                 $hashSMS null,
  573.                 $uwandzaniToken null,
  574.                 $facebookId null,
  575.                 $googleId null,
  576.                 $appleId null,
  577.                 $isForFake false,
  578.                 $userData = []
  579.             );
  580.             $user->setTiktokId($tiktokId);
  581.             $this->em->flush();
  582.         }
  583.         return new JsonResponse([
  584.             'message' => 'Utilisateur TikTok créé avec succès',
  585.             'uuid' => $user->getUuid(),
  586.         ], 201);
  587.     }
  588.     /**
  589.      * @Route("/pu/s/u/reset-password", name="api_user_reset_password", methods={"POST"})
  590.      */
  591.     public function resetPassword(Request $requestUserRepository $userRepository): JsonResponse
  592.     {
  593.         $data json_decode($request->getContent(), true);
  594.         $email $data['email'] ?? null;
  595.         if (!$email) {
  596.             return new JsonResponse(['message' => 'Email est obligatoire.'], 400);
  597.         }
  598.         $user $userRepository->findOneBy(['email' => $email]);
  599.         if (!$user) {
  600.             return new JsonResponse(['message' => 'Utilisateur introuvable.'], 404);
  601.         }
  602.         // Générez et envoyez un token pour réinitialiser le mot de passe ici
  603.         // Par exemple, vous pouvez envoyer un lien avec un token via email
  604.         return new JsonResponse(['message' => 'Lien de réinitialisation envoyé.']);
  605.     }
  606.     /**
  607.      * @Route("/api/pr/s/u/change-phone", name="api_user_change_phone", methods={"POST"})
  608.      */
  609.     public function changePhone(Request $requestUserRepository $userRepository): JsonResponse
  610.     {
  611.         $data json_decode($request->getContent(), true);
  612.         /** @var User $user */
  613.         $user $this->getUser();
  614.         $newPhone $data['newPhone'] ?? null;
  615.         if (!$user || !$newPhone) {
  616.             return new JsonResponse(['message' => 'Tous les champs sont obligatoires.'], 400);
  617.         }
  618.         $existingUser $userRepository->findOneBy(['phone' => $newPhone]);
  619.         if ($existingUser) {
  620.             return new JsonResponse(['message' => 'Ce numéro de téléphone est déjà utilisé.'], 400);
  621.         }
  622.         $user->setPhone($newPhone);
  623.         $this->em->flush();
  624.         return new JsonResponse(['message' => 'Numéro de téléphone changé avec succès.']);
  625.     }
  626.     /**
  627.      * @Route("/api/pr/s/u/change-email", name="api_user_change_email", methods={"POST"})
  628.      */
  629.     public function changeEmail(Request $requestUserRepository $userRepository): JsonResponse
  630.     {
  631.         $data json_decode($request->getContent(), true);
  632.         /** @var User $user */
  633.         $user $this->getUser();
  634.         $newEmail $data['newEmail'] ?? null;
  635.         if (!$user || !$newEmail) {
  636.             return new JsonResponse(['message' => 'Tous les champs sont obligatoires.'], 400);
  637.         }
  638.         $existingUser $userRepository->findOneBy(['email' => $newEmail]);
  639.         if ($existingUser) {
  640.             return new JsonResponse(['message' => 'Cet email est déjà utilisé.'], 400);
  641.         }
  642.         $user->setEmail($newEmail);
  643.         $this->em->flush();
  644.         return new JsonResponse(['message' => 'Email changé avec succès.']);
  645.     }
  646.     /**
  647.      * ***************************
  648.      *  Web : Affiche la page de demande de lien + envoie le lien si POST
  649.      * ***************************
  650.      * @Route("/app/pr/s/u/send-link-to-change-password", name="app_user_send_link_to_change_password", methods={"POST", "GET"})
  651.      *
  652.      * ***************************
  653.      *  API : Envoie un lien pour réinitialiser le mot de passe
  654.      * ***************************
  655.      * @Route("/api/pr/s/u/send-link-to-change-password", name="api_user_send_link_to_change_password", methods={"POST"})
  656.      */
  657.     public function sendLinkToChangePassword(UserRepository $userRepositoryRequest $request): Response
  658.     {
  659.         $route $request->get('_route');
  660.         // Récupération de l'email selon la route
  661.         if ($route === 'api_user_send_link_to_change_password') {
  662.             $data json_decode($request->getContent(), true);
  663.             $email $data['email'] ?? null;
  664.         } else {
  665.             $email $request->request->get('email');
  666.         }
  667.         $user $email $userRepository->findOneBy(['email' => $email]) : null;
  668.         if (!$user) {
  669.             if ($route === 'api_user_send_link_to_change_password') {
  670.                 return new JsonResponse(['message' => 'Utilisateur introuvable.'], 404);
  671.             } else {
  672.                 $this->addFlash('error''Utilisateur introuvable.');
  673.                 return $this->render('security/lost_pw.html.twig');
  674.             }
  675.         }
  676.         // Cas de la version Web
  677.         if ($route === 'app_user_send_link_to_change_password') {
  678.             if ($request->getMethod() === "POST") {
  679.                 $user->setConfirmationToken(); // Génère un token aléatoire
  680.                 //$this->notificationMailService->envoieLienRappelMp($user); // Envoi du mail
  681.                 $this->em->flush();
  682.                 $this->addFlash('success''Un lien de récupération vous a été envoyé par mail.');
  683.                 return $this->redirectToRoute('home');
  684.             } else {
  685.                 return $this->render('security/lost_pw.html.twig');
  686.             }
  687.         }
  688.         // Cas API
  689.         $user->setConfirmationToken();
  690.         // $this->notificationMailService->envoieLienRappelMp($user);
  691.         $this->em->flush();
  692.         return new JsonResponse(['message' => 'Lien de réinitialisation envoyé.']);
  693.     }
  694.     /**
  695.      * @Route("/api/pr/s/u/change-password", name="api_user_change_password", methods={"POST"})
  696.      */
  697.     public function changePassword(Request $requestUserRepository $userRepositoryUserPasswordHasherInterface $passwordHasher): JsonResponse
  698.     {
  699.         $data json_decode($request->getContent(), true);
  700.         /** @var User $user */
  701.         $user $this->getUser();
  702.         $oldPassword $data['oldPassword'] ?? null;
  703.         $newPassword $data['newPassword'] ?? null;
  704.         if (!$user || !$oldPassword || !$newPassword) {
  705.             return new JsonResponse(['message' => 'Tous les champs sont obligatoires.'], 400);
  706.         }
  707.         if (!$passwordHasher->isPasswordValid($user$oldPassword)) {
  708.             return new JsonResponse(['message' => 'Ancien mot de passe incorrect.'], 401);
  709.         }
  710.         $hashedPassword $passwordHasher->hashPassword($user$newPassword);
  711.         $user->setPassword($hashedPassword);
  712.         $this->em->flush();
  713.         //$this->notificationMailService->envoieLienRappelMp($user);
  714.         return new JsonResponse(['message' => 'Mot de passe changé avec succès.']);
  715.     }
  716.     /**
  717.      * @Route("/api/delete-my-user", name="delete_my_user", methods={"GET"})
  718.      */
  719.     function deleteUser()
  720.     {
  721.         /**
  722.          * @var User $currentUser
  723.          */
  724.         $currentUser $this->getUser();
  725.         // Ici je vais mettre toute la gestion de l'utilisateur supprimé
  726.         $this->securityService->deleteUser($currentUser);
  727.         $authToken $this->securityService->createAndUpdateJwtToken($this->getUser());
  728.         return new JsonResponse(['token' => $authToken]);
  729.         //return new JsonResponse("Utilisateur supprimée");
  730.     }
  731.     ////////////////////////////////////// Fakes User //////////////////////////////////////
  732.     /******************************
  733.      * Créer des utilisateurs fictifs
  734.      * avec des emails
  735.      *****************************/
  736.     /**
  737.      * @Route("/pu/fake-users/email", name="api_create_fake_users_with_email", methods={"GET"})
  738.      */
  739.     public function createFakeUserWithEmail(Request $requestUserRepository $userRepository): Response
  740.     {
  741.         /***
  742.          * Vide les fake users avant de créer de nouveaux utilisateurs fictifs
  743.          * pour éviter les doublons
  744.          */
  745.         $fakeUsers $userRepository->findBy(['isForFake' => true]);
  746.         if ($fakeUsers) {
  747.             return $this->redirectToRoute(
  748.                 'app_security_user_delete_fake_users',
  749.                 ["nextRoute" => "api_create_fake_users_with_email"]
  750.             );
  751.         }
  752.         $userFakes $this->fakeData->getUserFakeData();
  753.         $createdUsers $this->createFakeUsersWithEmail($userFakes);
  754.         return new JsonResponse([
  755.             'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  756.             'created_users' => $createdUsers,
  757.         ], 201);
  758.     }
  759.     /******************************
  760.      * Créer des utilisateurs fictifs
  761.      * avec des numéros de téléphone
  762.      *****************************/
  763.     /**
  764.      * @Route("/pu/fake-users/phone", name="api_create_fake_users_with_phone", methods={"GET"})
  765.      */
  766.     public function createFakeUserWithPhone(Request $requestUserRepository $userRepository): Response
  767.     {
  768.         $fakeUsers $userRepository->findBy(['isForFake' => true]);
  769.         if ($fakeUsers) {
  770.             return $this->redirectToRoute(
  771.                 'app_security_user_delete_fake_users',
  772.                 [
  773.                     "nextRoute" => "api_create_fake_users_with_phone"
  774.                 ]
  775.             );
  776.         }
  777.         $userFakes $this->fakeData->getUserFakeData();
  778.         $createdUsers $this->createFakeUsersWithPhone($userFakes);
  779.         return new JsonResponse([
  780.             'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  781.             'created_users' => $createdUsers,
  782.         ], 201);
  783.     }
  784.     /******************************
  785.      * Créer des utilisateurs fictifs
  786.      * avec des ID Uwandzani
  787.      *****************************/
  788.     /**
  789.      * @Route("/pu/fake-users/uwandzani", name="api_create_fake_users_with_uwandzani", methods={"GET"})
  790.      */
  791.     public function createFakeUserWithUwandzani(Request $requestUserRepository $userRepository): Response
  792.     {
  793.         if ($request->get('_route') === 'api_create_fake_users_with_uwandzani') {
  794.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  795.             if ($fakeUsers) {
  796.                 return $this->redirectToRoute(
  797.                     'app_security_user_delete_fake_users',
  798.                     [
  799.                         "nextRoute" => "api_create_fake_users_with_uwandzani"
  800.                     ]
  801.                 );
  802.             }
  803.             $userFakes $this->fakeData->getUserFakeData();
  804.             $createdUsers $this->createFakeUsersWithUwandzani($userFakes);
  805.             return new JsonResponse([
  806.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  807.                 'created_users' => $createdUsers,
  808.             ], 201);
  809.         }
  810.         $data json_decode($request->getContent(), true);
  811.         $uwandzaniToken $data['uwandzaniToken'] ?? null;
  812.         $userData null;
  813.         $user $this->createUserWithCredentials(
  814.             $email null,
  815.             $phone null,
  816.             $hashSMS null,
  817.             $uwandzaniToken,
  818.             $facebookId null,
  819.             $googleId null,
  820.             $appleId null,
  821.             $isForFake false,
  822.             $userData = []
  823.         );
  824.         if ($user instanceof JsonResponse) {
  825.             return $user;
  826.         }
  827.         return new JsonResponse(['message' => 'Utilisateur créé avec succès''uuid' => $user->getUuid()], 201);
  828.     }
  829.     /******************************
  830.      * Créer des utilisateurs fictifs
  831.      * avec des ID Facebook
  832.      *****************************/
  833.     /**
  834.      * @Route("/pu/s/u/create-user/facebook", name="api_create_user_with_facebook", methods={"POST"})
  835.      * @Route("/pu/fake-users/facebook", name="api_create_fake_users_with_facebook", methods={"GET"})
  836.      */
  837.     public function createFakeUserWithFacebook(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  838.     {
  839.         if ($request->get('_route') === 'api_create_fake_users_with_facebook') {
  840.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  841.             if ($fakeUsers) {
  842.                 return $this->redirectToRoute(
  843.                     'app_security_user_delete_fake_users',
  844.                     ["nextRoute" => "api_create_fake_users_with_facebook"]
  845.                 );
  846.             }
  847.             $userFakes $this->fakeData->getUserFakeData();
  848.             $createdUsers $this->createFakeUsersWithFacebook($userFakes);
  849.             return new JsonResponse([
  850.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  851.                 'created_users' => $createdUsers,
  852.             ], 201);
  853.         }
  854.         $client $clientRegistry->getClient('facebook');
  855.         $userInfo $client->fetchUser();
  856.         // On vérifie si l'utilisateur existe déjà
  857.         $facebookId $userInfo->getId();
  858.         $user $userRepository->findOneBy(['facebookId' => $facebookId]);
  859.         if (!$user) {
  860.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  861.             $user $this->createUserWithCredentials(
  862.                 $email null,
  863.                 $phone null,
  864.                 $hashSMS null,
  865.                 $uwandzaniToken null,
  866.                 $facebookId,
  867.                 $googleId null,
  868.                 $appleId null,
  869.                 $isForFake false,
  870.                 $userData = []
  871.             );
  872.         }
  873.         return new JsonResponse([
  874.             'message' => 'Utilisateur Facebook créé avec succès',
  875.             'uuid' => $user->getUuid(),
  876.         ], 201);
  877.     }
  878.     /******************************
  879.      * Créer des utilisateurs fictifs
  880.      * avec des ID Google
  881.      *****************************/
  882.     /**
  883.      * @Route("/pu/s/u/create-user/google", name="api_create_user_with_google", methods={"POST"})
  884.      * @Route("/pu/fake-users/google", name="api_create_fake_users_with_google", methods={"GET"})
  885.      */
  886.     public function createFakeUserWithGoogle(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  887.     {
  888.         if ($request->get('_route') === 'api_create_fake_users_with_google') {
  889.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  890.             if ($fakeUsers) {
  891.                 return $this->redirectToRoute(
  892.                     'app_security_user_delete_fake_users',
  893.                     ["nextRoute" => "api_create_fake_users_with_google"]
  894.                 );
  895.             }
  896.             $userFakes $this->fakeData->getUserFakeData();
  897.             $createdUsers $this->createFakeUsersWithGoogle($userFakes);
  898.             return new JsonResponse([
  899.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  900.                 'created_users' => $createdUsers,
  901.             ], 201);
  902.         }
  903.         $client $clientRegistry->getClient('google');
  904.         $userInfo $client->fetchUser();
  905.         $googleId $userInfo->getId();
  906.         $user $userRepository->findOneBy(['googleId' => $googleId]);
  907.         if (!$user) {
  908.             $user $this->createUserWithCredentials(
  909.                 $email null,
  910.                 $phone null,
  911.                 $hashSMS null,
  912.                 $uwandzaniToken null,
  913.                 $facebookId null,
  914.                 $googleId,
  915.                 $appleId null,
  916.                 $isForFake false,
  917.                 $userData = []
  918.             );
  919.         }
  920.         return new JsonResponse([
  921.             'message' => 'Utilisateur Google créé avec succès',
  922.             'uuid' => $user->getUuid(),
  923.         ], 201);
  924.     }
  925.     /******************************
  926.      * Créer des utilisateurs fictifs
  927.      * avec des ID Apple
  928.      *****************************/
  929.     /**
  930.      * @Route("/pu/s/u/create-user/apple", name="api_create_user_with_apple", methods={"POST"})
  931.      * @Route("/pu/fake-users/apple", name="api_create_fake_users_with_apple", methods={"GET"})
  932.      */
  933.     public function createFakeUserWithApple(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  934.     {
  935.         if ($request->get('_route') === 'api_create_fake_users_with_apple') {
  936.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  937.             if ($fakeUsers) {
  938.                 return $this->redirectToRoute(
  939.                     'app_security_user_delete_fake_users',
  940.                     ["nextRoute" => "api_create_fake_users_with_apple"]
  941.                 );
  942.             }
  943.             $userFakes $this->fakeData->getUserFakeData();
  944.             $createdUsers $this->createFakeUsersWithApple($userFakes);
  945.             return new JsonResponse([
  946.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  947.                 'created_users' => $createdUsers,
  948.             ], 201);
  949.         }
  950.         $client $clientRegistry->getClient('apple');
  951.         $userInfo $client->fetchUser();
  952.         $appleId $userInfo->getId();
  953.         $user $userRepository->findOneBy(['appleId' => $appleId]);
  954.         if (!$user) {
  955.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  956.             $user $this->createUserWithCredentials(
  957.                 $email null,
  958.                 $phone null,
  959.                 $hashSMS null,
  960.                 $uwandzaniToken null,
  961.                 $facebookId null,
  962.                 $googleId null,
  963.                 $appleId,
  964.                 $isForFake false,
  965.                 $userData = []
  966.             );
  967.         }
  968.         return new JsonResponse([
  969.             'message' => 'Utilisateur Apple créé avec succès',
  970.             'uuid' => $user->getUuid(),
  971.         ], 201);
  972.     }
  973.     /******************************
  974.      * Créer des utilisateurs fictifs
  975.      * avec des ID Instagram
  976.      *****************************/
  977.     /**
  978.      * @Route("/pu/s/u/create-user/instagram", name="api_create_user_with_instagram", methods={"POST"})
  979.      * @Route("/pu/fake-users/instagram", name="api_create_fake_users_with_instagram", methods={"GET"})
  980.      */
  981.     public function createFakeUserWithInstagram(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  982.     {
  983.         if ($request->get('_route') === 'api_create_fake_users_with_instagram') {
  984.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  985.             if ($fakeUsers) {
  986.                 return $this->redirectToRoute(
  987.                     'app_security_user_delete_fake_users',
  988.                     ["nextRoute" => "api_create_fake_users_with_instagram"]
  989.                 );
  990.             }
  991.             $userFakes $this->fakeData->getUserFakeData();
  992.             $createdUsers $this->createFakeUsersWithInstagram($userFakes);
  993.             return new JsonResponse([
  994.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  995.                 'created_users' => $createdUsers,
  996.             ], 201);
  997.         }
  998.         $client $clientRegistry->getClient('instagram');
  999.         $userInfo $client->fetchUser();
  1000.         $instagramId $userInfo->getId();
  1001.         $user $userRepository->findOneBy(['instagramId' => $instagramId]);
  1002.         if (!$user) {
  1003.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  1004.             $user $this->createUserWithCredentials(
  1005.                 $email null,
  1006.                 $phone null,
  1007.                 $hashSMS null,
  1008.                 $uwandzaniToken null,
  1009.                 $facebookId null,
  1010.                 $googleId null,
  1011.                 $appleId null,
  1012.                 $isForFake false,
  1013.                 $userData = []
  1014.             );
  1015.             $user->setInstagramId($instagramId);
  1016.             $this->em->flush();
  1017.         }
  1018.         return new JsonResponse([
  1019.             'message' => 'Utilisateur Instagram créé avec succès',
  1020.             'uuid' => $user->getUuid(),
  1021.         ], 201);
  1022.     }
  1023.     /******************************
  1024.      * Créer des utilisateurs fictifs
  1025.      * avec des ID TikTok
  1026.      *****************************/
  1027.     /**
  1028.      * @Route("/pu/s/u/create-user/tiktok", name="api_create_user_with_tiktok", methods={"POST"})
  1029.      * @Route("/pu/fake-users/tiktok", name="api_create_fake_users_with_tiktok", methods={"GET"})
  1030.      */
  1031.     public function createFakeUserWithTikTok(Request $requestUserRepository $userRepositoryClientRegistry $clientRegistry): Response
  1032.     {
  1033.         if ($request->get('_route') === 'api_create_fake_users_with_tiktok') {
  1034.             $fakeUsers $userRepository->findBy(['isForFake' => true]);
  1035.             if ($fakeUsers) {
  1036.                 return $this->redirectToRoute(
  1037.                     'app_security_user_delete_fake_users',
  1038.                     ["nextRoute" => "api_create_fake_users_with_tiktok"]
  1039.                 );
  1040.             }
  1041.             $userFakes $this->fakeData->getUserFakeData();
  1042.             $createdUsers $this->createFakeUsersWithTikTok($userFakes);
  1043.             return new JsonResponse([
  1044.                 'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
  1045.                 'created_users' => $createdUsers,
  1046.             ], 201);
  1047.         }
  1048.         $client $clientRegistry->getClient('tiktok');
  1049.         $userInfo $client->fetchUser();
  1050.         $tiktokId $userInfo->getId();
  1051.         $user $userRepository->findOneBy(['tiktokId' => $tiktokId]);
  1052.         if (!$user) {
  1053.             // Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
  1054.             $user $this->createUserWithCredentials(
  1055.                 $email null,
  1056.                 $phone null,
  1057.                 $hashSMS null,
  1058.                 $uwandzaniToken null,
  1059.                 $facebookId null,
  1060.                 $googleId null,
  1061.                 $appleId null,
  1062.                 $isForFake false,
  1063.                 $userData = []
  1064.             );
  1065.             $user->setTiktokId($tiktokId);
  1066.             $this->em->flush();
  1067.         }
  1068.         return new JsonResponse([
  1069.             'message' => 'Utilisateur TikTok créé avec succès',
  1070.             'uuid' => $user->getUuid(),
  1071.         ], 201);
  1072.     }
  1073.     //////////////////////////////////// Methodes privées ////////////////////////////////////
  1074.     /*******************
  1075.      * Créer un User avec Email
  1076.      *******************/
  1077.     private function createUserWithEmailForApi(string $email): Response
  1078.     {
  1079.         $user $this->createUserWithCredentials(
  1080.             $email,
  1081.             $phone null,
  1082.             $hashSMS null,
  1083.             $uwandzaniToken null,
  1084.             $facebookId null,
  1085.             $googleId null,
  1086.             $appleId null,
  1087.             $isForFake false,
  1088.             $userData = []
  1089.         );
  1090.         if ($user instanceof JsonResponse) {
  1091.             return $user;
  1092.         }
  1093.         return new JsonResponse(['message' => 'Utilisateur créé avec succès''uuid' => $user->getUuid()], 201);
  1094.     }
  1095.     /*******************
  1096.      * Créer un User avec Phone
  1097.      *******************/
  1098.     private function createUserWithPhoneForApi(string $phone, ?array $hashSMS): User
  1099.     {
  1100.         $user $this->createUserWithCredentials(
  1101.             $email null,
  1102.             $phone $phone,
  1103.             $hashSMS $hashSMS,
  1104.             $uwandzaniToken null,
  1105.             $facebookId null,
  1106.             $googleId null,
  1107.             $appleId null,
  1108.             $isForFake false,
  1109.             $userData = []
  1110.         );
  1111.         return $user;
  1112.     }
  1113.     ////////////////////////// Réseaux socio //////////////////////////
  1114.     /**
  1115.      * @Route("/oauth/connect/{serviceName}", name="oauth_connect", methods={"GET"})
  1116.      */
  1117.     public function getOauthScreen(string $serviceNameClientRegistry $clientRegistry): Response
  1118.     {
  1119.         if (!array_key_exists($serviceNameself::SCOPES)) {
  1120.             throw new \Exception('Service non pris en charge');
  1121.         }
  1122.         return $clientRegistry->getClient($serviceName)->redirect(
  1123.             self::SCOPES[$serviceName],
  1124.             [] // Ajoutez un tableau vide comme deuxième argument
  1125.         );
  1126.     }
  1127.     /**
  1128.      * @Route("/connect/google/check", name="connect_google_check", methods={"GET"})
  1129.      */
  1130.     public function connectGoogleCheck(): Response
  1131.     {
  1132.         // Cette méthode sera appelée après la redirection de l'utilisateur depuis Google
  1133.         // Vous pouvez ajouter votre logique de traitement ici
  1134.         return $this->redirectToRoute('home');
  1135.     }
  1136.     private function findUserByCredentials(string $identifier): ?User
  1137.     {
  1138.         $user $this->userRepository->findOneBy(['phone' => $identifier]);
  1139.         if (!$user) {
  1140.             $user $this->userRepository->findOneBy(['uwandzaniToken' => $identifier]);
  1141.         }
  1142.         if (!$user) {
  1143.             $user $this->userRepository->findOneBy(['email' => $identifier]);
  1144.         }
  1145.         if (!$user) {
  1146.             $user $this->userRepository->findOneBy(['facebookId' => $identifier]);
  1147.         }
  1148.         if (!$user) {
  1149.             $user $this->userRepository->findOneBy(['googleId' => $identifier]);
  1150.         }
  1151.         if (!$user) {
  1152.             $user $this->userRepository->findOneBy(['appleId' => $identifier]);
  1153.         }
  1154.         if (!$user) {
  1155.             $user $this->userRepository->findOneBy(['instagramId' => $identifier]);
  1156.         }
  1157.         return $user;
  1158.     }
  1159.     private function createUser($identifierType$identifier$hashSMS): User
  1160.     {
  1161.         if ($identifierType === 'phone') {
  1162.             $newUser $this->createUserWithPhoneForApi($identifier$hashSMS);
  1163.         } elseif ($identifierType === 'email') {
  1164.             $newUser $this->createUserWithEmailForApi($identifier);
  1165.             //$user->generateVerificationCode();
  1166.             // On Envoyer de validation de l'adresse email
  1167.         }
  1168.         // elseif ($identifierType === 'uwandzani') {
  1169.         //     $newUser = $this->createUserWithCredentials($identifier);
  1170.         // } elseif ($identifierType === 'facebook') {
  1171.         //     $newUser = $this->createUserWithCredentials($identifier);
  1172.         // } elseif ($identifierType === 'google') {
  1173.         //     $newUser = $this->createUserWithCredentials($identifier);
  1174.         // } elseif ($identifierType === 'apple') {
  1175.         //     $newUser = $this->createUserWithCredentials($identifier);
  1176.         // } elseif ($identifierType === 'instagram') {
  1177.         //     $newUser = $this->createUserWithCredentials($identifier);
  1178.         // }
  1179.         return $newUser;
  1180.     }
  1181.     private function generateVerificationCode(User $user, ?array $hashSMS$identifierType)
  1182.     {
  1183.         if ($user->getPhone() && $identifierType === 'phone') {
  1184.             $user->generateVerificationCode();
  1185.             $this->em->flush();
  1186.             $message "<#>Votre code de validation " $_ENV['APP_NAME'] . " est : " $user->getVerificationCode() . "\n" $hashSMS[0];
  1187.             $this->smsGenerator->sendSms($user->getPhone(), $message);
  1188.         }
  1189.     }
  1190.     //////////////////////////////////////////////////// Méthodes privées /////////////////////////////////////////////////
  1191.     ////////////////////////// Méthode pour créer des utilisateurs //////////////////////////
  1192.     private function createUserWithCredentials(
  1193.         ?string $email,
  1194.         ?string $phone,
  1195.         ?array $hashSMS,
  1196.         ?string $uwandzaniToken,
  1197.         ?string $facebookId,
  1198.         ?string $googleId,
  1199.         ?string $appleId,
  1200.         bool $isForFake false,
  1201.         array $userData = []
  1202.     ) {
  1203.         $user = new User();
  1204.         $user->setIsForFake($isForFake);
  1205.         if ($email) {
  1206.             $user $this->setUserWithEmail($user$email);
  1207.         } elseif ($phone) {
  1208.             $user $this->setUserWithPhone($user$phone$hashSMS);
  1209.         } elseif ($uwandzaniToken) {
  1210.             $user $this->setUserWithUwandzani($user$uwandzaniToken);
  1211.         } elseif ($facebookId) {
  1212.             $user $this->setUserWithFacebook($user$facebookId);
  1213.         } elseif ($googleId) {
  1214.             $user $this->setUserWithGoogle($user$googleId);
  1215.         } elseif ($appleId) {
  1216.             $user $this->setUserWithApple($user$appleId);
  1217.         }
  1218.         if ($uwandzaniToken === null) {
  1219.             //$hashedPassword = $this->passwordHasher->hashPassword($user, $password);
  1220.             //$user->setPassword($hashedPassword);
  1221.             $user->setRoles(['ROLE_USER']);
  1222.         } else {
  1223.             $user
  1224.                 ->setUwandzaniToken($uwandzaniToken)
  1225.                 //->setPassword($password)
  1226.                 ->setEmail($userData['email'])
  1227.                 ->setPhone($userData['phone'])
  1228.                 ->setFacebookId($userData['facebookId'])
  1229.                 ->setGoogleId($userData['googleId'])
  1230.                 ->setAppleId($userData['appleId'])
  1231.                 ->setUwandzaniId($userData['uwandzaniId']);
  1232.         }
  1233.         $this->em->persist($user);
  1234.         $this->em->flush();
  1235.         return $user;
  1236.     }
  1237.     ////////////////////////// Méthodes pour chaque type d'authentification //////////////////////////
  1238.     private function setUserWithEmail(User $userstring $email)
  1239.     {
  1240.         $existingUser $this->em->getRepository(User::class)->findOneBy(['email' => $email]);
  1241.         if ($existingUser) {
  1242.             return new JsonResponse(['message' => 'Un utilisateur existe déjà avec cet email.'], 400);
  1243.         }
  1244.         $user->setEmail($email);
  1245.         return $user;
  1246.     }
  1247.     private function setUserWithPhone(User $userstring $phone, ?array $hashSMS)
  1248.     {
  1249.         $existingUser $this->em->getRepository(User::class)->findOneBy(['phone' => $phone]);
  1250.         if ($existingUser) {
  1251.             return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce numéro de téléphone.'], 400);
  1252.         }
  1253.         $user->setPhone($phone);
  1254.         $message "<#>Votre code de validation " $_ENV['APP_NAME'] . " est : " $user->getVerificationCode() . "\n" $hashSMS[0];
  1255.         $this->smsGenerator->sendSms($phone$message);
  1256.         return $user;
  1257.     }
  1258.     private function setUserWithUwandzani(User $userstring $uwandzaniToken)
  1259.     {
  1260.         $existingUser $this->em->getRepository(User::class)->findOneBy(['uwandzaniToken' => $uwandzaniToken]);
  1261.         if ($existingUser) {
  1262.             return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce token Uwandzani.'], 400);
  1263.         }
  1264.         $user->setUwandzaniToken($uwandzaniToken);
  1265.         return $user;
  1266.     }
  1267.     private function setUserWithFacebook(User $userstring $facebookId)
  1268.     {
  1269.         $existingUser $this->em->getRepository(User::class)->findOneBy(['facebookId' => $facebookId]);
  1270.         if ($existingUser) {
  1271.             return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce Facebook ID.'], 400);
  1272.         }
  1273.         $user->setFacebookId($facebookId);
  1274.         return $user;
  1275.     }
  1276.     private function setUserWithGoogle(User $userstring $googleId)
  1277.     {
  1278.         $existingUser $this->em->getRepository(User::class)->findOneBy(['googleId' => $googleId]);
  1279.         if ($existingUser) {
  1280.             return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce Google ID.'], 400);
  1281.         }
  1282.         $user->setGoogleId($googleId);
  1283.         return $user;
  1284.     }
  1285.     private function setUserWithApple(User $userstring $appleId)
  1286.     {
  1287.         $existingUser $this->em->getRepository(User::class)->findOneBy(['appleId' => $appleId]);
  1288.         if ($existingUser) {
  1289.             return new JsonResponse(['message' => 'Un utilisateur existe déjà avec cet Apple ID.'], 400);
  1290.         }
  1291.         $user->setAppleId($appleId);
  1292.         return $user;
  1293.     }
  1294.     ////////////////////////// Suppression des utilisateurs fictifs //////////////////////////
  1295.     /**
  1296.      * @Route("/pr/s/u/delete-fake-users/{nextRoute}", name="app_security_user_delete_fake_users", methods={"GET"})
  1297.      */
  1298.     public function deleteFakeUsers(UserRepository $userRepositorystring $nextRoute): Response
  1299.     {
  1300.         $fakeUsers $userRepository->findBy(['isForFake' => true]);
  1301.         foreach ($fakeUsers as $fakeUser) {
  1302.             $this->em->remove($fakeUser);
  1303.             $this->em->flush();
  1304.         }
  1305.         return $this->redirectToRoute($nextRoute, [], Response::HTTP_SEE_OTHER);
  1306.     }
  1307.     ////////////////////////// Création d'utilisateurs fictifs pour chaque méthode //////////////////////////
  1308.     private function createFakeUsersWithEmail(array $fakeUsersData): array
  1309.     {
  1310.         $createdUsers = [];
  1311.         foreach ($fakeUsersData as $userData) {
  1312.             $result $this->createUserWithCredentials(
  1313.                 $userData['email'],
  1314.                 null,
  1315.                 null,
  1316.                 null,
  1317.                 null,
  1318.                 null,
  1319.                 true
  1320.             );
  1321.             if ($result instanceof JsonResponse) {
  1322.                 continue;
  1323.             }
  1324.             $createdUsers[] = ['email' => $userData['email']];
  1325.         }
  1326.         return $createdUsers;
  1327.     }
  1328.     private function createFakeUsersWithPhone(array $fakeUsersData): array
  1329.     {
  1330.         $createdUsers = [];
  1331.         foreach ($fakeUsersData as $userData) {
  1332.             $result $this->createUserWithCredentials(
  1333.                 null,
  1334.                 $userData['phone'],
  1335.                 null,
  1336.                 null,
  1337.                 null,
  1338.                 null,
  1339.                 true
  1340.             );
  1341.             if ($result instanceof JsonResponse) {
  1342.                 continue;
  1343.             }
  1344.             $createdUsers[] = ['phone' => $userData['phone']];
  1345.         }
  1346.         return $createdUsers;
  1347.     }
  1348.     private function createFakeUsersWithUwandzani(array $fakeUsersData): array
  1349.     {
  1350.         $createdUsers = [];
  1351.         foreach ($fakeUsersData as $userData) {
  1352.             $result $this->createUserWithCredentials(
  1353.                 null,
  1354.                 null,
  1355.                 $userData['uwandzaniToken'],
  1356.                 null,
  1357.                 null,
  1358.                 null,
  1359.                 true
  1360.             );
  1361.             if ($result instanceof JsonResponse) {
  1362.                 continue;
  1363.             }
  1364.             $createdUsers[] = ['uwandzaniToken' => $userData['uwandzaniToken']];
  1365.         }
  1366.         return $createdUsers;
  1367.     }
  1368.     private function createFakeUsersWithFacebook(array $fakeUsersData): array
  1369.     {
  1370.         $createdUsers = [];
  1371.         foreach ($fakeUsersData as $userData) {
  1372.             $result $this->createUserWithCredentials(
  1373.                 null,
  1374.                 null,
  1375.                 null,
  1376.                 $userData['facebookId'],
  1377.                 null,
  1378.                 null,
  1379.                 true
  1380.             );
  1381.             if ($result instanceof JsonResponse) {
  1382.                 continue;
  1383.             }
  1384.             $createdUsers[] = ['facebookId' => $userData['facebookId']];
  1385.         }
  1386.         return $createdUsers;
  1387.     }
  1388.     private function createFakeUsersWithGoogle(array $fakeUsersData): array
  1389.     {
  1390.         $createdUsers = [];
  1391.         foreach ($fakeUsersData as $userData) {
  1392.             $result $this->createUserWithCredentials(
  1393.                 null,
  1394.                 null,
  1395.                 null,
  1396.                 null,
  1397.                 $userData['googleId'],
  1398.                 null,
  1399.                 true
  1400.             );
  1401.             if ($result instanceof JsonResponse) {
  1402.                 continue;
  1403.             }
  1404.             $createdUsers[] = ['googleId' => $userData['googleId']];
  1405.         }
  1406.         return $createdUsers;
  1407.     }
  1408.     private function createFakeUsersWithApple(array $fakeUsersData): array
  1409.     {
  1410.         $createdUsers = [];
  1411.         foreach ($fakeUsersData as $userData) {
  1412.             $result $this->createUserWithCredentials(
  1413.                 null,
  1414.                 null,
  1415.                 null,
  1416.                 null,
  1417.                 null,
  1418.                 $userData['appleId'],
  1419.                 true
  1420.             );
  1421.             if ($result instanceof JsonResponse) {
  1422.                 continue;
  1423.             }
  1424.             $createdUsers[] = ['appleId' => $userData['appleId']];
  1425.         }
  1426.         return $createdUsers;
  1427.     }
  1428.     private function createFakeUsersWithTikTok(array $fakeUsersData): array
  1429.     {
  1430.         $createdUsers = [];
  1431.         foreach ($fakeUsersData as $userData) {
  1432.             $result $this->createUserWithCredentials(
  1433.                 null,
  1434.                 null,
  1435.                 null,
  1436.                 null,
  1437.                 null,
  1438.                 null,
  1439.                 true
  1440.             );
  1441.             if ($result instanceof JsonResponse) {
  1442.                 continue;
  1443.             }
  1444.             // Ajouter l'ID TikTok pour l'utilisateur fictif
  1445.             $result->setTiktokId($userData['tiktokId']);
  1446.             $this->em->persist($result);
  1447.             $this->em->flush();
  1448.             $createdUsers[] = ['tiktokId' => $userData['tiktokId']];
  1449.         }
  1450.         return $createdUsers;
  1451.     }
  1452.     private function createFakeUsersWithInstagram(array $fakeUsersData): array
  1453.     {
  1454.         $createdUsers = [];
  1455.         foreach ($fakeUsersData as $userData) {
  1456.             $result $this->createUserWithCredentials(
  1457.                 null,
  1458.                 null,
  1459.                 null,
  1460.                 null,
  1461.                 null,
  1462.                 null,
  1463.                 true
  1464.             );
  1465.             if ($result instanceof JsonResponse) {
  1466.                 continue;
  1467.             }
  1468.             // Ajouter l'ID Instagram pour l'utilisateur fictif
  1469.             $result->setInstagramId($userData['instagramId']);
  1470.             $this->em->persist($result);
  1471.             $this->em->flush();
  1472.             $createdUsers[] = ['instagramId' => $userData['instagramId']];
  1473.         }
  1474.         return $createdUsers;
  1475.     }
  1476. }