<?php
namespace App\Controller\Security;
use App\Ressources\FakeData;
use App\Entity\Security\User;
use App\Form\Security\LoginFormType;
use App\Service\SmsGeneratorService;
use App\Service\UwandzaniApiService;
use Doctrine\ORM\EntityManagerInterface;
use App\Service\Security\SecurityService;
use App\Form\Security\RegistrationFormType;
use App\Repository\Security\UserRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Services\Notification\NotificationMailService;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
final class SecurityController extends AbstractController
{
private EntityManagerInterface $em;
private UserPasswordHasherInterface $passwordHasher;
private FakeData $fakeData;
private JWTTokenManagerInterface $JWTTokenManager;
private UwandzaniApiService $uwandzaniApiService;
private SmsGeneratorService $smsGenerator;
private CsrfTokenManagerInterface $csrfTokenManager;
private UserRepository $userRepository;
private SecurityService $securityService;
//private NotificationMailService $notificationMailService;
public const SCOPES = [
'google' => [],
'facebook' => [
'email',
'public_profile',
'user_friends',
'pages_show_list',
'phone',
'pages_read_engagement',
'pages_manage_metadata',
'pages_read_user_content',
'pages_manage_ads',
'pages_manage_engagement',
'pages_manage_posts',
'pages_manage_read',
'pages_manage_comments',
'pages_manage_jobs',
'pages_manage_leads',
],
'apple' => [],
'instagram' => [],
'uber' => [],
'phone' => [],
'email' => [],
];
public function __construct(
EntityManagerInterface $em,
UserPasswordHasherInterface $passwordHasher,
FakeData $fakeData,
JWTTokenManagerInterface $JWTTokenManager,
UwandzaniApiService $uwandzaniApiService,
SmsGeneratorService $smsGenerator,
CsrfTokenManagerInterface $csrfTokenManager,
UserRepository $userRepository,
SecurityService $securityService
) {
$this->em = $em;
$this->passwordHasher = $passwordHasher;
$this->fakeData = $fakeData;
$this->JWTTokenManager = $JWTTokenManager;
$this->uwandzaniApiService = $uwandzaniApiService;
$this->smsGenerator = $smsGenerator;
$this->csrfTokenManager = $csrfTokenManager;
$this->userRepository = $userRepository;
$this->securityService = $securityService;
//$this->notificationMailService = $notificationMailService;
}
/******************************
* Affiche le formulaire web
* de connexion
* Et le formulaire web
* d'inscription
* ***************************/
/**
* @Route("/", name="app_login", methods={"GET", "POST"})
* @Route("/app-registration", name="app_home_regisatration", methods={"GET", "POST"})
*/
public function homePage(
Request $request,
EntityManagerInterface $em,
UserPasswordHasherInterface $passwordHasher
): Response {
if ($this->getUser()) {
return $this->redirectToRoute('app_project_project_task_position_index');
}
// Créer les formulaires sans passer manuellement le jeton CSRF
$loginForm = $this->createForm(LoginFormType::class);
$registrationForm = $this->createForm(RegistrationFormType::class);
$loginForm->handleRequest($request);
$registrationForm->handleRequest($request);
// Traiter l'enregistrement
if ($registrationForm->isSubmitted() && $registrationForm->isValid()) {
$data = $registrationForm->getData();
$user = new User();
$user->setEmail($data['email']);
// Hachage du mot de passe
$hashedPassword = $passwordHasher->hashPassword(
$user,
$data['password']
);
$user->setPassword($hashedPassword);
// Enregistrer l'utilisateur dans la base de données
$em->persist($user);
$em->flush();
$this->addFlash('success', 'Inscription réussie !');
// Rediriger l'utilisateur après inscription réussie
return $this->redirectToRoute('app_home_project_index');
}
return $this->render('security/home.html.twig', [
'form_login' => $loginForm->createView(),
'form_registration' => $registrationForm->createView(),
]);
}
/////////////////////////// Login //////////////////////////
/******************************
* Authentification de l'utilisateur
* à partir du web
***************************/
/**
* @Route("/auth/login", name="login", methods={"GET"})
*/
public function loginFromWeb(): Response
{
if ($this->getUser()) {
return $this->redirectToRoute('home');
}
return $this->render('security/login.html.twig');
}
/******************************
* Récupère l'identifiant Authentification de l'utilisateur
* à partir de l'API
*
* Si l'utilisateur n'existe pas, il est créé
* et un code de vérification est envoyé
***************************/
/**
* @Route("/get-login-identifier-from-api", name="api_get_login_identifier_from_api", methods={"POST"})
*/
public function createAndLoginFromApi(Request $request, UserRepository $userRepository): JsonResponse
{
$user = null;
$data = json_decode($request->getContent(), true);
$isUwandzaniIdentifier = $data['isUwandzaniIdentifier'] ?? false;
$identifier = $data['identifier'] ?? null;
$identifierType = $data['identifierType'] ?? null;
$hashSMS = $data['hashSMS'] ?? null;
$plainPassword = $data['password'] ?? null;
/***********************
* Vérifie si l'utilisateur existe
* ************************/
if ($identifier) {
$user = $this->findUserByCredentials($identifier);
}
// Si l'utilisateur n'est pas trouvé, on crée l'utilisateur
if (!$user && array_key_exists($identifierType, self::SCOPES) && !$isUwandzaniIdentifier) {
$user = $this->createUser($identifier, $identifierType, $hashSMS, $plainPassword);
//$sendVerificationCode = false;
}
if ($isUwandzaniIdentifier) {
$uwandzaniCredantials = $this->uwandzaniApiService->retreiveUwandzaniCredantials(
$identifier,
$identifierType,
$plainPassword,
$hashSMS
);
$this->findOrCreateUserWithUwandzani([
'uwandzaniId' => $uwandzaniCredantials['uwandzaniId'],
'identifier' => $uwandzaniCredantials['identifier'],
'identifierType' => $uwandzaniCredantials['identifierType'],
'hashSMS' => $uwandzaniCredantials['hashSMS'],
'plainPassword' => $uwandzaniCredantials['plainPassword'],
], $userRepository);
if (!$user) {
return new JsonResponse(['message' => 'Code de validation incorrect ou utilisateur non trouvé.'], 401);
}
} elseif ($identifierType === self::SCOPES['phone']) {
if ($identifier !== '+33782615889') {
// On continue
} elseif (
$identifierType === self::SCOPES['phone']
) {
$this->generateVerificationCode($user, $hashSMS, $identifierType);
}
} elseif ($identifierType === self::SCOPES['email']) {
/***
* On vérifie que le mot de passe entrée
* Corespond à celui de l'utilisateur
* Si c'est le cas, on continue
*/
if ($plainPassword) {
if (!$this->passwordHasher->isPasswordValid($user, $plainPassword)) {
return new JsonResponse(['message' => 'Au mo'], 401);
}
}
} elseif ($identifierType === self::SCOPES['google']) {
// code...
} elseif ($identifierType === self::SCOPES['facebook']) {
// code...
} elseif ($identifierType === self::SCOPES['apple']) {
// code...
} elseif ($identifierType === self::SCOPES['instagram']) {
// code...
} elseif ($identifierType === self::SCOPES['uber']) {
// code...
}
/***********************
* Si c'est une identification par Uwandzani
* On lui renvoie seulement l'identifiant public
*
* Ensuitel'application cliente devra générer son jeton
* d'authentification pour l'utilisateur
***********************/
if ($user && $isUwandzaniIdentifier) {
return new JsonResponse(
['uwandzaniId' => $user->getUuid()],
200
);
}
if (!$user) {
return new JsonResponse(['message' => 'Aucun moyen de connexion valide fourni.'], 400);
}
/**********************
* Si l'utilisateur est trouvé
* Et que ce n'est pas une athentification par Uwandzani
* On lui envoie un code de vérification
**************************/
$token = $this->securityService->createAndUpdateJwtToken($user);
return new JsonResponse([
'message' => 'Connexion réussie',
'token' => $token,
'user' => [
'uuid' => $user->getUuid(),
'email' => $user->getEmail(),
]
], 200);
}
// $recaptchaResponse = $request->get('recaptcha-response');
// if ($form->isSubmitted() && $form->isValid() && $this->isNotRobot($recaptchaResponse)) {
/******************************
* Verifie le code de vérification
* de l'utilisateur
*
* Si le code est correct, l'utilisateur
* est vérifié et un jeton d'authentification
* est généré et renvoyé au client
* Pour être connécté coté client
* ***************************/
/**
* @Route("/chek-verification-code", name="chek_verification_code", methods={"POST"})
*/
public function chekVerificationCode(Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
$identifier = $data['identifier'] ?? null;
$verificationCode = $data['verificationCode'] ?? null;
$identifierType = $data['identifierType'] ?? null;
$hashSMS = $data['hashSMS'] ?? null;
$plainPassword = $data['password'] ?? null;
$user = null;
if ($identifier) {
$user = $this->findUserByCredentials($identifier);
}
if ($user && $verificationCode && $user->getVerificationCode() === $verificationCode && ((new \DateTime('now')) > $user->getVerificationCodeExpiresdAt())) {
$token = $this->securityService->createAndUpdateJwtToken($user);
$user
->setIsVerified(true)
->setVerificationCode(null);
$this->em->flush();
return new JsonResponse([
'message' => 'Code de validation correct',
'authToken' => $token,
'user' => [
'uuid' => $user->getUuid(),
'email' => $user->getEmail(),
]
], 200);
}
return new JsonResponse(['message' => 'Code incorrect ou expiré'], 401);
}
/******************************
* Rafraîchir le jeton d'authentification
* de l'utilisateur
* ***************************/
/**
* @Route("/api/pr/s/u/refresh-token", name="api_user_refresh_token", methods={"GET"})
*/
public function refreshJwtToken(): JsonResponse
{
/** @var User $user */
$user = $this->getUser();
if (!$user) {
return new JsonResponse(['message' => 'Utilisateur non authentifié.'], 401);
}
$token = $this->securityService->createAndUpdateJwtToken($user);
return new JsonResponse([
'message' => 'Token rafraîchi avec succès',
'token' => $token,
'user' => $user->getUuid()
]);
}
/*******************************************
* Créer un utilisateur avec réseau sociaux
*******************************************/
/***
* Créer un utilisateur avec un
* ID Uwandzani
***/
private function findOrCreateUserWithUwandzani(array $uwandzaniCredantials, UserRepository $userRepository): Response
{
$identifier = $uwandzaniCredantials['identifier'] ?? null;
$identifierType = $uwandzaniCredantials['identifierType'] ?? null;
// $plainPassword = $uwandzaniCredantials['plainPassword'] ?? null;
$hashSMS = $uwandzaniCredantials['hashSMS'] ?? null;
$uwandzaniId = $uwandzaniCredantials['uwandzaniId'];
$user = $userRepository->findOneBy(['uwandzaniId' => $uwandzaniId]);
// Si l'utilisateur n'est pas trouvé, on crée l'utilisateur
if (!$user) {
$user = $this->createUser($identifier, $identifierType, $hashSMS);
}
/**********************
* Si l'utilisateur est trouvé
* Et que ce n'est pas une athentification par Uwandzani
* On lui envoie un code de vérification
**************************/
$token = $this->securityService->createAndUpdateJwtToken($user);
return new JsonResponse([
'message' => 'Connexion réussie',
'token' => $token,
'user' => [
'uuid' => $user->getUuid(),
'email' => $user->getEmail(),
]
], 200);
return new JsonResponse(['message' => 'Utilisateur créé avec succès', 'uuid' => $user->getUuid()], 201);
}
/***********************************
* Créer un utilisateur avec un
* ID Facebook
********************************/
/**
* @Route("/pu/s/u/create-user/facebook", name="api_create_user_with_facebook", methods={"POST"})
*/
public function createUserWithFacebook(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_facebook') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_facebook"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithFacebook($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('facebook');
$userInfo = $client->fetchUser();
// On vérifie si l'utilisateur existe déjà
$facebookId = $userInfo->getId();
$user = $userRepository->findOneBy(['facebookId' => $facebookId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
}
return new JsonResponse([
'message' => 'Utilisateur Facebook créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/***********************************
* Créer un utilisateur avec un
* ID Google
**********************************/
/**
* @Route("/pu/s/u/create-user/google", name="api_create_user_with_google", methods={"POST"})
*/
public function createUserWithGoogle(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_google') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_google"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithGoogle($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('google');
$userInfo = $client->fetchUser();
$googleId = $userInfo->getId();
$user = $userRepository->findOneBy(['googleId' => $googleId]);
if (!$user) {
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId,
$appleId = null,
$isForFake = false,
$userData = []
);
}
return new JsonResponse([
'message' => 'Utilisateur Google créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/*********************************
* Créer un utilisateur avec un
* ID Apple
********************************/
/**
* @Route("/pu/s/u/create-user/apple", name="api_create_user_with_apple", methods={"POST"})
*/
public function createUserWithApple(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_apple') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_apple"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithApple($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('apple');
$userInfo = $client->fetchUser();
$appleId = $userInfo->getId();
$user = $userRepository->findOneBy(['appleId' => $appleId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId,
$isForFake = false,
$userData = []
);
}
return new JsonResponse([
'message' => 'Utilisateur Apple créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/**************************************
* Créer un utilisateur avec un
* ID Instagram
************************************/
/**
* @Route("/pu/s/u/create-user/instagram", name="api_create_user_with_instagram", methods={"POST"})
*/
public function createUserWithInstagram(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_instagram') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_instagram"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithInstagram($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('instagram');
$userInfo = $client->fetchUser();
$instagramId = $userInfo->getId();
$user = $userRepository->findOneBy(['instagramId' => $instagramId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
$user->setInstagramId($instagramId);
$this->em->flush();
}
return new JsonResponse([
'message' => 'Utilisateur Instagram créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/**********************************
* Créer un utilisateur avec un
* ID TikTok
*********************************/
/**
* @Route("/pu/s/u/create-user/tiktok", name="api_create_user_with_tiktok", methods={"POST"})
*/
public function createUserWithTikTok(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_tiktok') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_tiktok"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithTikTok($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('tiktok');
$userInfo = $client->fetchUser();
$tiktokId = $userInfo->getId();
$user = $userRepository->findOneBy(['tiktokId' => $tiktokId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
$user->setTiktokId($tiktokId);
$this->em->flush();
}
return new JsonResponse([
'message' => 'Utilisateur TikTok créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/**
* @Route("/pu/s/u/reset-password", name="api_user_reset_password", methods={"POST"})
*/
public function resetPassword(Request $request, UserRepository $userRepository): JsonResponse
{
$data = json_decode($request->getContent(), true);
$email = $data['email'] ?? null;
if (!$email) {
return new JsonResponse(['message' => 'Email est obligatoire.'], 400);
}
$user = $userRepository->findOneBy(['email' => $email]);
if (!$user) {
return new JsonResponse(['message' => 'Utilisateur introuvable.'], 404);
}
// Générez et envoyez un token pour réinitialiser le mot de passe ici
// Par exemple, vous pouvez envoyer un lien avec un token via email
return new JsonResponse(['message' => 'Lien de réinitialisation envoyé.']);
}
/**
* @Route("/api/pr/s/u/change-phone", name="api_user_change_phone", methods={"POST"})
*/
public function changePhone(Request $request, UserRepository $userRepository): JsonResponse
{
$data = json_decode($request->getContent(), true);
/** @var User $user */
$user = $this->getUser();
$newPhone = $data['newPhone'] ?? null;
if (!$user || !$newPhone) {
return new JsonResponse(['message' => 'Tous les champs sont obligatoires.'], 400);
}
$existingUser = $userRepository->findOneBy(['phone' => $newPhone]);
if ($existingUser) {
return new JsonResponse(['message' => 'Ce numéro de téléphone est déjà utilisé.'], 400);
}
$user->setPhone($newPhone);
$this->em->flush();
return new JsonResponse(['message' => 'Numéro de téléphone changé avec succès.']);
}
/**
* @Route("/api/pr/s/u/change-email", name="api_user_change_email", methods={"POST"})
*/
public function changeEmail(Request $request, UserRepository $userRepository): JsonResponse
{
$data = json_decode($request->getContent(), true);
/** @var User $user */
$user = $this->getUser();
$newEmail = $data['newEmail'] ?? null;
if (!$user || !$newEmail) {
return new JsonResponse(['message' => 'Tous les champs sont obligatoires.'], 400);
}
$existingUser = $userRepository->findOneBy(['email' => $newEmail]);
if ($existingUser) {
return new JsonResponse(['message' => 'Cet email est déjà utilisé.'], 400);
}
$user->setEmail($newEmail);
$this->em->flush();
return new JsonResponse(['message' => 'Email changé avec succès.']);
}
/**
* ***************************
* Web : Affiche la page de demande de lien + envoie le lien si POST
* ***************************
* @Route("/app/pr/s/u/send-link-to-change-password", name="app_user_send_link_to_change_password", methods={"POST", "GET"})
*
* ***************************
* API : Envoie un lien pour réinitialiser le mot de passe
* ***************************
* @Route("/api/pr/s/u/send-link-to-change-password", name="api_user_send_link_to_change_password", methods={"POST"})
*/
public function sendLinkToChangePassword(UserRepository $userRepository, Request $request): Response
{
$route = $request->get('_route');
// Récupération de l'email selon la route
if ($route === 'api_user_send_link_to_change_password') {
$data = json_decode($request->getContent(), true);
$email = $data['email'] ?? null;
} else {
$email = $request->request->get('email');
}
$user = $email ? $userRepository->findOneBy(['email' => $email]) : null;
if (!$user) {
if ($route === 'api_user_send_link_to_change_password') {
return new JsonResponse(['message' => 'Utilisateur introuvable.'], 404);
} else {
$this->addFlash('error', 'Utilisateur introuvable.');
return $this->render('security/lost_pw.html.twig');
}
}
// Cas de la version Web
if ($route === 'app_user_send_link_to_change_password') {
if ($request->getMethod() === "POST") {
$user->setConfirmationToken(); // Génère un token aléatoire
//$this->notificationMailService->envoieLienRappelMp($user); // Envoi du mail
$this->em->flush();
$this->addFlash('success', 'Un lien de récupération vous a été envoyé par mail.');
return $this->redirectToRoute('home');
} else {
return $this->render('security/lost_pw.html.twig');
}
}
// Cas API
$user->setConfirmationToken();
// $this->notificationMailService->envoieLienRappelMp($user);
$this->em->flush();
return new JsonResponse(['message' => 'Lien de réinitialisation envoyé.']);
}
/**
* @Route("/api/pr/s/u/change-password", name="api_user_change_password", methods={"POST"})
*/
public function changePassword(Request $request, UserRepository $userRepository, UserPasswordHasherInterface $passwordHasher): JsonResponse
{
$data = json_decode($request->getContent(), true);
/** @var User $user */
$user = $this->getUser();
$oldPassword = $data['oldPassword'] ?? null;
$newPassword = $data['newPassword'] ?? null;
if (!$user || !$oldPassword || !$newPassword) {
return new JsonResponse(['message' => 'Tous les champs sont obligatoires.'], 400);
}
if (!$passwordHasher->isPasswordValid($user, $oldPassword)) {
return new JsonResponse(['message' => 'Ancien mot de passe incorrect.'], 401);
}
$hashedPassword = $passwordHasher->hashPassword($user, $newPassword);
$user->setPassword($hashedPassword);
$this->em->flush();
//$this->notificationMailService->envoieLienRappelMp($user);
return new JsonResponse(['message' => 'Mot de passe changé avec succès.']);
}
/**
* @Route("/api/delete-my-user", name="delete_my_user", methods={"GET"})
*/
function deleteUser()
{
/**
* @var User $currentUser
*/
$currentUser = $this->getUser();
// Ici je vais mettre toute la gestion de l'utilisateur supprimé
$this->securityService->deleteUser($currentUser);
$authToken = $this->securityService->createAndUpdateJwtToken($this->getUser());
return new JsonResponse(['token' => $authToken]);
//return new JsonResponse("Utilisateur supprimée");
}
////////////////////////////////////// Fakes User //////////////////////////////////////
/******************************
* Créer des utilisateurs fictifs
* avec des emails
*****************************/
/**
* @Route("/pu/fake-users/email", name="api_create_fake_users_with_email", methods={"GET"})
*/
public function createFakeUserWithEmail(Request $request, UserRepository $userRepository): Response
{
/***
* Vide les fake users avant de créer de nouveaux utilisateurs fictifs
* pour éviter les doublons
*/
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_email"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithEmail($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
/******************************
* Créer des utilisateurs fictifs
* avec des numéros de téléphone
*****************************/
/**
* @Route("/pu/fake-users/phone", name="api_create_fake_users_with_phone", methods={"GET"})
*/
public function createFakeUserWithPhone(Request $request, UserRepository $userRepository): Response
{
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
[
"nextRoute" => "api_create_fake_users_with_phone"
]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithPhone($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
/******************************
* Créer des utilisateurs fictifs
* avec des ID Uwandzani
*****************************/
/**
* @Route("/pu/fake-users/uwandzani", name="api_create_fake_users_with_uwandzani", methods={"GET"})
*/
public function createFakeUserWithUwandzani(Request $request, UserRepository $userRepository): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_uwandzani') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
[
"nextRoute" => "api_create_fake_users_with_uwandzani"
]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithUwandzani($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$data = json_decode($request->getContent(), true);
$uwandzaniToken = $data['uwandzaniToken'] ?? null;
$userData = null;
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken,
$facebookId = null,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
if ($user instanceof JsonResponse) {
return $user;
}
return new JsonResponse(['message' => 'Utilisateur créé avec succès', 'uuid' => $user->getUuid()], 201);
}
/******************************
* Créer des utilisateurs fictifs
* avec des ID Facebook
*****************************/
/**
* @Route("/pu/s/u/create-user/facebook", name="api_create_user_with_facebook", methods={"POST"})
* @Route("/pu/fake-users/facebook", name="api_create_fake_users_with_facebook", methods={"GET"})
*/
public function createFakeUserWithFacebook(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_facebook') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_facebook"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithFacebook($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('facebook');
$userInfo = $client->fetchUser();
// On vérifie si l'utilisateur existe déjà
$facebookId = $userInfo->getId();
$user = $userRepository->findOneBy(['facebookId' => $facebookId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
}
return new JsonResponse([
'message' => 'Utilisateur Facebook créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/******************************
* Créer des utilisateurs fictifs
* avec des ID Google
*****************************/
/**
* @Route("/pu/s/u/create-user/google", name="api_create_user_with_google", methods={"POST"})
* @Route("/pu/fake-users/google", name="api_create_fake_users_with_google", methods={"GET"})
*/
public function createFakeUserWithGoogle(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_google') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_google"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithGoogle($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('google');
$userInfo = $client->fetchUser();
$googleId = $userInfo->getId();
$user = $userRepository->findOneBy(['googleId' => $googleId]);
if (!$user) {
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId,
$appleId = null,
$isForFake = false,
$userData = []
);
}
return new JsonResponse([
'message' => 'Utilisateur Google créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/******************************
* Créer des utilisateurs fictifs
* avec des ID Apple
*****************************/
/**
* @Route("/pu/s/u/create-user/apple", name="api_create_user_with_apple", methods={"POST"})
* @Route("/pu/fake-users/apple", name="api_create_fake_users_with_apple", methods={"GET"})
*/
public function createFakeUserWithApple(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_apple') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_apple"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithApple($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('apple');
$userInfo = $client->fetchUser();
$appleId = $userInfo->getId();
$user = $userRepository->findOneBy(['appleId' => $appleId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId,
$isForFake = false,
$userData = []
);
}
return new JsonResponse([
'message' => 'Utilisateur Apple créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/******************************
* Créer des utilisateurs fictifs
* avec des ID Instagram
*****************************/
/**
* @Route("/pu/s/u/create-user/instagram", name="api_create_user_with_instagram", methods={"POST"})
* @Route("/pu/fake-users/instagram", name="api_create_fake_users_with_instagram", methods={"GET"})
*/
public function createFakeUserWithInstagram(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_instagram') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_instagram"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithInstagram($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('instagram');
$userInfo = $client->fetchUser();
$instagramId = $userInfo->getId();
$user = $userRepository->findOneBy(['instagramId' => $instagramId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
$user->setInstagramId($instagramId);
$this->em->flush();
}
return new JsonResponse([
'message' => 'Utilisateur Instagram créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
/******************************
* Créer des utilisateurs fictifs
* avec des ID TikTok
*****************************/
/**
* @Route("/pu/s/u/create-user/tiktok", name="api_create_user_with_tiktok", methods={"POST"})
* @Route("/pu/fake-users/tiktok", name="api_create_fake_users_with_tiktok", methods={"GET"})
*/
public function createFakeUserWithTikTok(Request $request, UserRepository $userRepository, ClientRegistry $clientRegistry): Response
{
if ($request->get('_route') === 'api_create_fake_users_with_tiktok') {
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
if ($fakeUsers) {
return $this->redirectToRoute(
'app_security_user_delete_fake_users',
["nextRoute" => "api_create_fake_users_with_tiktok"]
);
}
$userFakes = $this->fakeData->getUserFakeData();
$createdUsers = $this->createFakeUsersWithTikTok($userFakes);
return new JsonResponse([
'message' => count($createdUsers) . ' utilisateurs fictifs créés avec succès.',
'created_users' => $createdUsers,
], 201);
}
$client = $clientRegistry->getClient('tiktok');
$userInfo = $client->fetchUser();
$tiktokId = $userInfo->getId();
$user = $userRepository->findOneBy(['tiktokId' => $tiktokId]);
if (!$user) {
// Créer un nouvel utilisateur si aucun utilisateur correspondant trouvé
$user = $this->createUserWithCredentials(
$email = null,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
$user->setTiktokId($tiktokId);
$this->em->flush();
}
return new JsonResponse([
'message' => 'Utilisateur TikTok créé avec succès',
'uuid' => $user->getUuid(),
], 201);
}
//////////////////////////////////// Methodes privées ////////////////////////////////////
/*******************
* Créer un User avec Email
*******************/
private function createUserWithEmailForApi(string $email): Response
{
$user = $this->createUserWithCredentials(
$email,
$phone = null,
$hashSMS = null,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
if ($user instanceof JsonResponse) {
return $user;
}
return new JsonResponse(['message' => 'Utilisateur créé avec succès', 'uuid' => $user->getUuid()], 201);
}
/*******************
* Créer un User avec Phone
*******************/
private function createUserWithPhoneForApi(string $phone, ?array $hashSMS): User
{
$user = $this->createUserWithCredentials(
$email = null,
$phone = $phone,
$hashSMS = $hashSMS,
$uwandzaniToken = null,
$facebookId = null,
$googleId = null,
$appleId = null,
$isForFake = false,
$userData = []
);
return $user;
}
////////////////////////// Réseaux socio //////////////////////////
/**
* @Route("/oauth/connect/{serviceName}", name="oauth_connect", methods={"GET"})
*/
public function getOauthScreen(string $serviceName, ClientRegistry $clientRegistry): Response
{
if (!array_key_exists($serviceName, self::SCOPES)) {
throw new \Exception('Service non pris en charge');
}
return $clientRegistry->getClient($serviceName)->redirect(
self::SCOPES[$serviceName],
[] // Ajoutez un tableau vide comme deuxième argument
);
}
/**
* @Route("/connect/google/check", name="connect_google_check", methods={"GET"})
*/
public function connectGoogleCheck(): Response
{
// Cette méthode sera appelée après la redirection de l'utilisateur depuis Google
// Vous pouvez ajouter votre logique de traitement ici
return $this->redirectToRoute('home');
}
private function findUserByCredentials(string $identifier): ?User
{
$user = $this->userRepository->findOneBy(['phone' => $identifier]);
if (!$user) {
$user = $this->userRepository->findOneBy(['uwandzaniToken' => $identifier]);
}
if (!$user) {
$user = $this->userRepository->findOneBy(['email' => $identifier]);
}
if (!$user) {
$user = $this->userRepository->findOneBy(['facebookId' => $identifier]);
}
if (!$user) {
$user = $this->userRepository->findOneBy(['googleId' => $identifier]);
}
if (!$user) {
$user = $this->userRepository->findOneBy(['appleId' => $identifier]);
}
if (!$user) {
$user = $this->userRepository->findOneBy(['instagramId' => $identifier]);
}
return $user;
}
private function createUser($identifierType, $identifier, $hashSMS): User
{
if ($identifierType === 'phone') {
$newUser = $this->createUserWithPhoneForApi($identifier, $hashSMS);
} elseif ($identifierType === 'email') {
$newUser = $this->createUserWithEmailForApi($identifier);
//$user->generateVerificationCode();
// On Envoyer de validation de l'adresse email
}
// elseif ($identifierType === 'uwandzani') {
// $newUser = $this->createUserWithCredentials($identifier);
// } elseif ($identifierType === 'facebook') {
// $newUser = $this->createUserWithCredentials($identifier);
// } elseif ($identifierType === 'google') {
// $newUser = $this->createUserWithCredentials($identifier);
// } elseif ($identifierType === 'apple') {
// $newUser = $this->createUserWithCredentials($identifier);
// } elseif ($identifierType === 'instagram') {
// $newUser = $this->createUserWithCredentials($identifier);
// }
return $newUser;
}
private function generateVerificationCode(User $user, ?array $hashSMS, $identifierType)
{
if ($user->getPhone() && $identifierType === 'phone') {
$user->generateVerificationCode();
$this->em->flush();
$message = "<#>Votre code de validation " . $_ENV['APP_NAME'] . " est : " . $user->getVerificationCode() . "\n" . $hashSMS[0];
$this->smsGenerator->sendSms($user->getPhone(), $message);
}
}
//////////////////////////////////////////////////// Méthodes privées /////////////////////////////////////////////////
////////////////////////// Méthode pour créer des utilisateurs //////////////////////////
private function createUserWithCredentials(
?string $email,
?string $phone,
?array $hashSMS,
?string $uwandzaniToken,
?string $facebookId,
?string $googleId,
?string $appleId,
bool $isForFake = false,
array $userData = []
) {
$user = new User();
$user->setIsForFake($isForFake);
if ($email) {
$user = $this->setUserWithEmail($user, $email);
} elseif ($phone) {
$user = $this->setUserWithPhone($user, $phone, $hashSMS);
} elseif ($uwandzaniToken) {
$user = $this->setUserWithUwandzani($user, $uwandzaniToken);
} elseif ($facebookId) {
$user = $this->setUserWithFacebook($user, $facebookId);
} elseif ($googleId) {
$user = $this->setUserWithGoogle($user, $googleId);
} elseif ($appleId) {
$user = $this->setUserWithApple($user, $appleId);
}
if ($uwandzaniToken === null) {
//$hashedPassword = $this->passwordHasher->hashPassword($user, $password);
//$user->setPassword($hashedPassword);
$user->setRoles(['ROLE_USER']);
} else {
$user
->setUwandzaniToken($uwandzaniToken)
//->setPassword($password)
->setEmail($userData['email'])
->setPhone($userData['phone'])
->setFacebookId($userData['facebookId'])
->setGoogleId($userData['googleId'])
->setAppleId($userData['appleId'])
->setUwandzaniId($userData['uwandzaniId']);
}
$this->em->persist($user);
$this->em->flush();
return $user;
}
////////////////////////// Méthodes pour chaque type d'authentification //////////////////////////
private function setUserWithEmail(User $user, string $email)
{
$existingUser = $this->em->getRepository(User::class)->findOneBy(['email' => $email]);
if ($existingUser) {
return new JsonResponse(['message' => 'Un utilisateur existe déjà avec cet email.'], 400);
}
$user->setEmail($email);
return $user;
}
private function setUserWithPhone(User $user, string $phone, ?array $hashSMS)
{
$existingUser = $this->em->getRepository(User::class)->findOneBy(['phone' => $phone]);
if ($existingUser) {
return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce numéro de téléphone.'], 400);
}
$user->setPhone($phone);
$message = "<#>Votre code de validation " . $_ENV['APP_NAME'] . " est : " . $user->getVerificationCode() . "\n" . $hashSMS[0];
$this->smsGenerator->sendSms($phone, $message);
return $user;
}
private function setUserWithUwandzani(User $user, string $uwandzaniToken)
{
$existingUser = $this->em->getRepository(User::class)->findOneBy(['uwandzaniToken' => $uwandzaniToken]);
if ($existingUser) {
return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce token Uwandzani.'], 400);
}
$user->setUwandzaniToken($uwandzaniToken);
return $user;
}
private function setUserWithFacebook(User $user, string $facebookId)
{
$existingUser = $this->em->getRepository(User::class)->findOneBy(['facebookId' => $facebookId]);
if ($existingUser) {
return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce Facebook ID.'], 400);
}
$user->setFacebookId($facebookId);
return $user;
}
private function setUserWithGoogle(User $user, string $googleId)
{
$existingUser = $this->em->getRepository(User::class)->findOneBy(['googleId' => $googleId]);
if ($existingUser) {
return new JsonResponse(['message' => 'Un utilisateur existe déjà avec ce Google ID.'], 400);
}
$user->setGoogleId($googleId);
return $user;
}
private function setUserWithApple(User $user, string $appleId)
{
$existingUser = $this->em->getRepository(User::class)->findOneBy(['appleId' => $appleId]);
if ($existingUser) {
return new JsonResponse(['message' => 'Un utilisateur existe déjà avec cet Apple ID.'], 400);
}
$user->setAppleId($appleId);
return $user;
}
////////////////////////// Suppression des utilisateurs fictifs //////////////////////////
/**
* @Route("/pr/s/u/delete-fake-users/{nextRoute}", name="app_security_user_delete_fake_users", methods={"GET"})
*/
public function deleteFakeUsers(UserRepository $userRepository, string $nextRoute): Response
{
$fakeUsers = $userRepository->findBy(['isForFake' => true]);
foreach ($fakeUsers as $fakeUser) {
$this->em->remove($fakeUser);
$this->em->flush();
}
return $this->redirectToRoute($nextRoute, [], Response::HTTP_SEE_OTHER);
}
////////////////////////// Création d'utilisateurs fictifs pour chaque méthode //////////////////////////
private function createFakeUsersWithEmail(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
$userData['email'],
null,
null,
null,
null,
null,
true
);
if ($result instanceof JsonResponse) {
continue;
}
$createdUsers[] = ['email' => $userData['email']];
}
return $createdUsers;
}
private function createFakeUsersWithPhone(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
null,
$userData['phone'],
null,
null,
null,
null,
true
);
if ($result instanceof JsonResponse) {
continue;
}
$createdUsers[] = ['phone' => $userData['phone']];
}
return $createdUsers;
}
private function createFakeUsersWithUwandzani(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
null,
null,
$userData['uwandzaniToken'],
null,
null,
null,
true
);
if ($result instanceof JsonResponse) {
continue;
}
$createdUsers[] = ['uwandzaniToken' => $userData['uwandzaniToken']];
}
return $createdUsers;
}
private function createFakeUsersWithFacebook(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
null,
null,
null,
$userData['facebookId'],
null,
null,
true
);
if ($result instanceof JsonResponse) {
continue;
}
$createdUsers[] = ['facebookId' => $userData['facebookId']];
}
return $createdUsers;
}
private function createFakeUsersWithGoogle(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
null,
null,
null,
null,
$userData['googleId'],
null,
true
);
if ($result instanceof JsonResponse) {
continue;
}
$createdUsers[] = ['googleId' => $userData['googleId']];
}
return $createdUsers;
}
private function createFakeUsersWithApple(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
null,
null,
null,
null,
null,
$userData['appleId'],
true
);
if ($result instanceof JsonResponse) {
continue;
}
$createdUsers[] = ['appleId' => $userData['appleId']];
}
return $createdUsers;
}
private function createFakeUsersWithTikTok(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
null,
null,
null,
null,
null,
null,
true
);
if ($result instanceof JsonResponse) {
continue;
}
// Ajouter l'ID TikTok pour l'utilisateur fictif
$result->setTiktokId($userData['tiktokId']);
$this->em->persist($result);
$this->em->flush();
$createdUsers[] = ['tiktokId' => $userData['tiktokId']];
}
return $createdUsers;
}
private function createFakeUsersWithInstagram(array $fakeUsersData): array
{
$createdUsers = [];
foreach ($fakeUsersData as $userData) {
$result = $this->createUserWithCredentials(
null,
null,
null,
null,
null,
null,
true
);
if ($result instanceof JsonResponse) {
continue;
}
// Ajouter l'ID Instagram pour l'utilisateur fictif
$result->setInstagramId($userData['instagramId']);
$this->em->persist($result);
$this->em->flush();
$createdUsers[] = ['instagramId' => $userData['instagramId']];
}
return $createdUsers;
}
}