<?php
namespace App\Controller\API;
use App\Entity\Admin\Branch;
use App\Entity\Admin\BranchAdresse;
use App\Entity\Admin\BranchProduit;
use App\Entity\Admin\BranchProprietaire;
use App\Entity\Admin\Department;
use App\Entity\Admin\DepartmentProduit;
use App\Entity\Admin\Perimetre;
use App\Entity\Admin\Produit;
use App\Entity\Admin\ProfilDroit;
use App\Entity\Admin\Proprietaire;
use App\Entity\Admin\User;
use App\Entity\Admin\UserProduit;
use App\Manager\Admin\PerimetreManager;
use App\Manager\Admin\UserManager;
use App\Manager\Admin\DashboardManager;
use App\Manager\Admin\BranchAdresseManager;
use App\Manager\Admin\UserProduitManager;
use App\Manager\Admin\BranchManager;
use App\Repository\Admin\PerimetreSystemRepository;
use App\Repository\Admin\ProduitRepository;
use App\Service\PasswordManager;
use App\Service\ProduitApiConnector;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Yaml\Yaml;
/**
* @Route ("/api", name="api_")
*/
class ApiController
{
public function __construct(
private readonly EntityManagerInterface $em,
private readonly UserManager $userManager,
private readonly PerimetreManager $perimetreManager,
private readonly PerimetreSystemRepository $perimetreSystemRepository
) {}
private function checkProduit(string $produit, ?User $user, ?Department $userDepartment, ?Branch $userBranch): string|UserProduit
{
$produitRequest = $this->em->getRepository(Produit::class)->findOneBy(["name" => $produit]);
if (empty($produitRequest)) {
return 'Produit inexistant';
}
$userProduit = $this->em->getRepository(UserProduit::class)->findOneBy(['user' => $user, 'produit' => $produitRequest, 'isActive' => true]);
if (empty($userProduit)) {
return 'Utilisateur non activé sur le produit';
}
$departmentProduit = $this->em->getRepository(DepartmentProduit::class)->findOneBy(['department' => $userDepartment, 'produit' => $produitRequest, 'isActive' => true]);
if (empty($departmentProduit)) {
return 'Service non activé sur le produit';
}
$branchProduit = $this->em->getRepository(BranchProduit::class)->findOneBy(['branch' => $userBranch, 'produit' => $produitRequest, 'isActive' => true]);
if (empty($branchProduit)) {
return 'Organisation non activée sur le produit';
}
return $userProduit;
}
private function getRequestArray(Request $request): ?array
{
return json_decode(str_replace("'", '"', $request->getContent()), true);
}
/**
* @Route ("/branch", name="branch")
*/
public function getBranch(Request $request, BranchManager $branchManager, BranchAdresseManager $branchAdresseManager): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
if (!is_array($requestContent) || empty($requestContent['branch'])) return $this->returnBadAuthentication();
$branch = $branchManager->getRepository()->find($requestContent['branch']);
$proprietaires = [];
if ($branch->getBranchProprietaires()) {
foreach ($branch->getBranchProprietaires() as $bp) {
if (empty($bp->getDeletedAt())) {
$proprietaires[$bp->getProprietaire()->getCode()]['mnemonique'] = $bp->getMnemonique();
}
}
}
$content = [
"branch_id" => $branch->getId(),
"branch_name" => $branch->getMnemonique(),
'branch_raison_sociale' => $branch->getRaisonSociale(),
'branch_siret' => $branch->getSiret(),
'branch_telephone' => $branch->getTelephone(),
'branch_adresses' => $branchAdresseManager->formatAll($branch->getAdresses('postal'), true) + $branchAdresseManager->formatAll($branch->getAdresses(), true),
'proprietaires' => $proprietaires
];
return new JsonResponse(['message' => 'ok', 'branch' => $content]);
}
/**
* @Route ("/user/accept", name="user_accept_cg")
*/
public function acceptedCG(Request $request, UserProduitManager $userProduitManager): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
if (!is_array($requestContent)) return $this->returnBadAuthentication();
if (array_key_exists('token', $requestContent)) {
$user = $this->userManager->getRepository()->findOneBy(["token" => $requestContent['token'], "deletedAt" => null]);
if (empty($user)) {
return $this->returnBadAuthentication();
}
if (array_key_exists('produit', $requestContent)) {
$userProduit = $userProduitManager->getRepository()->getUserProduitByUserAndProduit($user, $requestContent['produit']);
if ($userProduit) {
switch ($requestContent['type']) {
case 'cgu':
$userProduit->setCguAcceptedAt(new DateTime());
break;
case 'cgv':
$userProduit->setCgvAcceptedAt(new DateTime());
break;
}
$userProduitManager->update($userProduit);
return new JsonResponse(['success' => 'ok']);
}
}
}
return $this->returnBadAuthentication();
}
/**
* @Route ("/user", name="user")
*/
public function getUser(Request $request, DashboardManager $dashboardManager, BranchAdresseManager $branchAdresseManager, PasswordManager $passwordManager, UserProduitManager $userProduitManager): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
if (!is_array($requestContent)) return $this->returnBadAuthentication();
$badAuth = false;
if (array_key_exists('username', $requestContent) and array_key_exists('password', $requestContent)) {
$user = $this->userManager->getRepository()->findOneBy(["username" => $requestContent['username'], "deletedAt" => null]);
if (empty($user)) {
$badAuth = true;
$this->userManager->addWrongUsername($requestContent['username'], $requestContent['ip'] ?? null);
} else {
if (!$this->userManager->getEncoder()->isPasswordValid($user, $requestContent['password'])) {
$this->userManager->addEchec($user, $requestContent['ip'] ?? null);
$badAuth = true;
} elseif (!$passwordManager->checkExpiration($user, $requestContent['produit'] ?? null)) {
return $this->returnExpiredPassword($user, $requestContent['produit'] ?? null);
}
}
} elseif (array_key_exists('token', $requestContent)) {
$user = $this->userManager->getRepository()->findOneBy(["token" => $requestContent['token'], "deletedAt" => null]);
if (empty($user)) {
return $this->returnBadAuthentication();
}
} else {
return $this->returnBadAuthentication();
}
$userDepartment = $user ? $user->getDepartment() : null;
$userBranch = $user ? $userDepartment->getBranch() : null;
if (array_key_exists('produit', $requestContent)) {
$produitRequest = $this->checkProduit($requestContent['produit'], $user, $userDepartment, $userBranch);
if (is_string($produitRequest)) {
$produitRequest = false;
//$this->returnBadAuthentication($produitRequest);
}
} else $produitRequest = false;
if ($user && $this->userManager->checkIfEchec($user, $requestContent['produit'] ?? null)) {
return $this->returnEchecPassword($user, $requestContent['produit'] ?? null);
}
if ($badAuth) {
return $this->returnBadAuthentication();
}
$this->userManager->resetEchec($user);
$proprietaires = [];
$mnemoniques = [];
if ($user->getDepartment()->getBranch()->getBranchProprietaires()) {
foreach ($user->getDepartment()->getBranch()->getBranchProprietaires() as $bp) {
if (empty($bp->getDeletedAt())) {
$mnemoniques[$bp->getProprietaire()->getCode()] = $bp->getMnemonique();
}
}
}
if ($user->getUserProprietaires()) {
foreach ($user->getUserProprietaires() as $proprietaire) {
if ($proprietaire->getIsActive() && empty($proprietaire->getDeletedAt())) {
if (!$produitRequest || !$produitRequest->getDefaultProprietaire() || $proprietaire == $produitRequest->getDefaultProprietaire()) {
$proprietaires[$proprietaire->getProprietaire()->getCode()] = [
'codeInterlocuteur' => $proprietaire->getCodeInterlocuteur(),
'mnemonique' => $mnemoniques[$proprietaire->getProprietaire()->getCode()] ?? null
];
}
}
}
}
$content = [
'infos' => [
'id' => $user->getId(),
'token' => $user->getToken(),
'username' => $user->getUsername(),
'civility' => $user->getCivility(),
'lastname' => $user->getLastname(),
'firstname' => $user->getFirstname(),
'email' => $user->getEmail(),
'email2' => $user->getEmail2() && strpos($user->getEmail2(), ',') !== false
? explode(',', $user->getEmail2())[0]
: $user->getEmail2(),
'telephone' => $user->getTelephone(),
'fonction' => $user->getFonction(),
'code_interlocuteur' => $user->getCodeInterlocuteur(),
"department_id" => $userDepartment->getId(),
"department_name" => $userDepartment->getName(),
"branch_id" => $userBranch->getId(),
"branch_name" => $userBranch->getMnemonique(),
'branch_raison_sociale' => $userBranch->getRaisonSociale(),
'branch_siret' => $userBranch->getSiret(),
'branch_telephone' => $userBranch->getTelephone(),
'branch_adresses' => $branchAdresseManager->formatAll($userBranch->getAdresses('postal'), true) + $branchAdresseManager->formatAll($userBranch->getAdresses(), true),
'access_users' => [],
'access_departments' => [],
'access_branches' => [],
'proprietaires' => $proprietaires
],
];
// variables access
foreach ($user->getAccessUsers() as $accessUser) {
$content['infos']['access_users'][$accessUser->getId()] = $accessUser->getUsername();
}
foreach ($user->getAccessDepartments() as $accessDepartment) {
$content['infos']['access_departments'][$accessDepartment->getId()] = $accessDepartment->getName();
}
foreach ($user->getAccessBranches() as $accessBranch) {
$content['infos']['access_branches'][$accessBranch->getId()] = $accessBranch->getMnemonique();
}
// Recherche JAZ_PRODUIT :
$produitsData = [];
$produits = [];
$switchableProducts = [];
foreach ($user->getUserProfils() as $userProfil) {
if ($userProfil->getIsActive()) {
$profil = $userProfil->getProfil();
$profilDroits = $profil->getProfilDroits();
foreach ($profilDroits as $profilDroit) {
$droit = $profilDroit->getDroit();
$produit = $droit->getProduit();
if ($produit && (!$produitRequest || $produit == $produitRequest->getProduit())) {
$produits[$produit->getName()] = $produit;
if ($produit->getUrl() && (empty($produits[$requestContent['produit'] ?? '']) || $produit !== $produits[$requestContent['produit'] ?? ''])) {
$switchableProducts[$produit->getName()] = [
'name' => $produit->getName(),
'logo' => $produit->getLogo() ? ($produit->getUrl() . $produit->getLogo()) : null,
'url' => $this->userManager->getSwitchUrl($user, $produit)[0] ?? null
];
}
$listCrude = [];
if (isset($produitsData[$produit->getName()][$droit->getCode()])) {
$listCrude = $produitsData[$produit->getName()][$droit->getCode()];
}
$produitsData[$produit->getName()][$droit->getCode()] = $this->formatProfilDroit($profilDroit, $listCrude);
}
}
}
}
$content['rights'] = $produitsData;
$content['switchableProducts'] = $switchableProducts;
$hasDbAuth = [];
foreach ($produits as $produit) {
if (!isset($hasDbAuth[$produit->getName()])) {
$branchProduit = $this->em->getRepository(BranchProduit::class)->findOneBy(['branch' => $userBranch, 'produit' => $produit]);
$userProduit = $this->em->getRepository(UserProduit::class)->findOneBy(['user' => $user, 'produit' => $produit]);
$hasDbAuth[$produit->getName()] = [
'branch' => ($branchProduit ? $branchProduit->getHasDbAuth() : false),
'user' => ($userProduit ? $userProduit->getHasDbAuth() : false),
];
}
}
$content['hasDbAuth'] = $hasDbAuth;
/** Gestion des dashboards */
$dashboardsData = [];
foreach ($produits as $kp => $vp) {
$dashboardsTmp = [];
$dashboards = $dashboardManager->getRepository()->getDashboardsByProductsAndUser($vp, $user);
if ($dashboards) {
foreach ($dashboards as $dashboard) {
$dashboardsTmp[] = $dashboardManager->formatDashboardDatas($dashboard, $user);
}
}
$dashboardsData[$kp] = $dashboardsTmp;
}
$content['dashboards'] = $dashboardsData;
/** Fin gestion des dashboards */
// Récupération des profils - Nécessaire pour simuler les Persona des forks de l'EC TDET
$userProfils = $user->getUserProfils();
$profils = [];
foreach ($userProfils as $userProfil) {
if ($userProfil->getIsActive()) {
$profils[$userProfil->getProfil()->getProduit()->getName()][] = $userProfil->getProfil()->getName();
}
}
$content['profils'] = $profils;
// Fonctionnalités
$detailFonctionnalites = [];
$detailFonctionnalitesD = [];
$detailFonctionnalitesU = [];
$content['fonctionnalites'] = [];
$userFonctionnalites = $user->getUserFonctionnalites();
$department_id = $userDepartment->getId();
foreach ($userFonctionnalites as $userFonctionnalite) {
$departmentFonctionnalite = $userFonctionnalite->getDepartmentFonctionnalite();
if ($departmentFonctionnalite->getDepartment()->getId() === $department_id) {
$detailFonctionnalite = $departmentFonctionnalite->getDetailFonctionnalite();
$fonctionnalite = $detailFonctionnalite->getFonctionnalite();
if (!$userFonctionnalite->getIsActive() or !$departmentFonctionnalite->getIsActive()) {
$detailFonctionnalite->setIsDisponible(false);
}
if ($detailFonctionnalite->getIsDisponible()) {
$detailFonctionnalites[$fonctionnalite->getId()] = $detailFonctionnalite;
$detailFonctionnalitesD[$fonctionnalite->getId()] = $departmentFonctionnalite;
$detailFonctionnalitesU[$fonctionnalite->getId()] = $userFonctionnalite;
}
}
}
foreach ($detailFonctionnalites as $detailFonctionnalite) {
$fonctionnalite = $detailFonctionnalite->getFonctionnalite();
$contentFonctionnalite = [
"libelle" => $detailFonctionnalite->getLibelleOverride() ?? $fonctionnalite->getLibelle(),
"show" => $detailFonctionnalite->getIsDisponible(),
];
if ($fonctionnalite->getType() === "field") {
$contentFonctionnalite += [
"required" => $detailFonctionnalite->getIsObligatoire(),
"type" => $detailFonctionnalite->getInputType(),
"regex" => $detailFonctionnalite->getRegexPattern(),
"pattern" => $detailFonctionnalite->getPattern(),
"min_length" => $detailFonctionnalite->getMinLength(),
"max_length" => $detailFonctionnalite->getMaxLength()
];
} elseif (!empty($fonctionnalite->getOptionsAvailableKey())) {
$optionsAvailable = $fonctionnalite->getOptionsAvailableKey();
$options = $detailFonctionnalite->getOptionsKey();
if (!empty($detailFonctionnalitesD[$fonctionnalite->getId()]) && !empty($detailFonctionnalitesD[$fonctionnalite->getId()]->getOptionsKey())) {
$optionsAvailable = $detailFonctionnalitesD[$fonctionnalite->getId()]->getOptionsKey();
$options = $detailFonctionnalitesD[$fonctionnalite->getId()]->getOptions();
}
if (!empty($detailFonctionnalitesU[$fonctionnalite->getId()]) && !empty($detailFonctionnalitesU[$fonctionnalite->getId()]->getOptionsKey())) {
$optionsAvailable = $detailFonctionnalitesU[$fonctionnalite->getId()]->getOptionsKey();
$options = $detailFonctionnalitesU[$fonctionnalite->getId()]->getOptions();
}
$optionsAvailable = explode('","', substr(substr($optionsAvailable, 2), 0, -2));
$options = explode('","', substr(substr($options, 2), 0, -2));
$contentOptions = [];
foreach ($optionsAvailable as $option) {
if (in_array($option, $options)) $contentOptions[$option] = true;
else $contentOptions[$option] = false;
}
$contentFonctionnalite += ['options' => $contentOptions];
}
$keyList = [];
while (!empty($fonctionnalite->getRootId())) {
$key = $fonctionnalite->getLibelleKey();
if ($fonctionnalite->getType() === "field") $key = 'field_' . $key;
$keyList[] = $key;
$fonctionnalite = $detailFonctionnalites[$fonctionnalite->getRootId()]->getFonctionnalite();
}
$key = $fonctionnalite->getLibelleKey();
if ($fonctionnalite->getType() === "field") $key = 'field_' . $key;
$keyList[] = $key;
$arrayToFill = &$content['fonctionnalites'];
while (sizeof($keyList) > 1) {
$key = array_pop($keyList);
if (!array_key_exists($key, $arrayToFill)) {
$arrayToFill[$key] = [];
}
$arrayToFill = &$arrayToFill[$key];
if (!array_key_exists('options', $arrayToFill)) {
$arrayToFill['options'] = [];
}
$arrayToFill = &$arrayToFill['options'];
}
$key = array_pop($keyList);
if (!array_key_exists($key, $arrayToFill)) {
$arrayToFill[$key] = [];
}
$arrayToFill[$key] += $contentFonctionnalite;
}
$content['fonctionnalites']['indice_thresh_exetr'] = -1;
if (!empty($requestContent['produit']) && $requestContent['produit'] === 'OOFTOP') {
$get_user_const = (Yaml::parseFile('../config/custom/get_user_const.yaml') ?? []);
$match_prestations = $get_user_const['match_prestations'] ?? [];
$prestations = $get_user_const['prestations'] ?? [];
foreach ($match_prestations as $fonctionnalite => $prestas) {
if (!isset($content['fonctionnalites'][$fonctionnalite]) || !isset($content['fonctionnalites'][$fonctionnalite]['show']) || $content['fonctionnalites'][$fonctionnalite]['show'] === false) {
foreach ($prestas as $presta) {
unset($prestations[$presta]);
}
}
}
$content['prestations'] = $prestations;
}
if (empty($requestContent['produit']) || $requestContent['produit'] === 'NOSE') {
$content['perimetre'] = $this->perimetreManager->getPerimetreByProductAndType($user->getPerimetres());
} elseif (!empty($requestContent['produit']) && !empty($produits[$requestContent['produit']])) {
$content['perimetre'] = $this->perimetreSystemRepository->getPerimetreSystemByUserAndProduct($user, $produits[$requestContent['produit']]);
$userProduit = $userProduitManager->getRepository()->getUserProduitByUserAndProduit($user, $requestContent['produit']);
if ($userProduit) {
$content['infos']['cguAcceptedAt'] = $userProduit->getCguAcceptedAt() ? $userProduit->getCguAcceptedAt()->format('Y-m-d') : null;
$content['infos']['cgvAcceptedAt'] = $userProduit->getCgvAcceptedAt() ? $userProduit->getCgvAcceptedAt()->format('Y-m-d') : null;
}
}
// Périmètre production
return new JsonResponse(['message' => 'ok', 'user' => $content]);
}
/**
* @Route("/password_constraints", name="password_constraints")
*/
public function sendPasswordContraints(PasswordManager $passwordManager): ?JsonResponse
{
$data = $passwordManager->sendConstraints();
return new JsonResponse($data);
}
/**
* @Route("/password/init", name="password_init")
*/
public function checkPasswordInitialization(Request $request): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
$username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
$token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
$plainPassword1 = $request->get('password1') ?? (array_key_exists('password1', $requestContent) ? $requestContent['password1'] : null);
$plainPassword2 = $request->get('password2') ?? (array_key_exists('password2', $requestContent) ? $requestContent['password2'] : null);
// Recherche de l'utilisateur
$user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
if (empty($user)) return new JsonResponse(['message' => 'Bad Request', 'error' => 'Utilisateur inconnu.'], 400);
if (!empty($token)) $user = $this->userManager->checkInitTokenValidity($token);
else return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
if (is_null($plainPassword1) or is_null($plainPassword2)) {
$result = ['Paramètres manquants'];
} else $result = $this->userManager->initPasswordByUser($user, $plainPassword1, $plainPassword2);
if (is_array($result)) {
return new JsonResponse(['message' => 'Bad Request', 'error' => $result], 400);
} elseif ($result instanceof User) {
$this->userManager->updatePassword($user, $plainPassword1);
return new JsonResponse(['message' => 'OK']);
}
return new JsonResponse(['message' => 'Internal Server Error'], 500);
}
/**
* @Route("/password/token/check", name="password_token_check")
*/
public function checkTokenValidity(Request $request): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
$token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
$user = null;
if (!empty($token)) {
$user = $this->userManager->checkResetTokenValidity($token);
if (!$user) {
$user = $this->userManager->checkTokenValidity($token);
}
}
if (!$user) {
return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
}
return new JsonResponse(['message' => 'Ok']);
}
/**
* @Route("/password/reset/check", name="password_reset_check")
*/
public function checkPasswordReset(Request $request): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
$username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
$token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
$plainPassword1 = $request->get('password1') ?? (array_key_exists('password1', $requestContent) ? $requestContent['password1'] : null);
$plainPassword2 = $request->get('password2') ?? (array_key_exists('password2', $requestContent) ? $requestContent['password2'] : null);
// Recherche de l'utilisateur
$user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
if (empty($user)) return new JsonResponse(['message' => 'Bad Request', 'error' => 'Utilisateur inconnu.'], 400);
if (!empty($token)) $user = $this->userManager->checkResetTokenValidity($token);
else return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
$result = $this->userManager->initPasswordByUser($user, $plainPassword1, $plainPassword2);
if (is_array($result)) {
return new JsonResponse(['message' => 'Bad Request', 'error' => $result], 400);
} elseif ($result instanceof User) {
$this->userManager->updatePassword($user, $plainPassword1);
$this->userManager->resetEchec($user);
return new JsonResponse(['message' => 'OK']);
}
return new JsonResponse(['message' => 'Internal Server Error'], 500);
}
/**
* @Route("/password/reset/request", name="password_reset_request")
*/
public function requestForPasswordReset(Request $request, ProduitApiConnector $connector): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
$username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
$produitName = $request->get('produit_name') ?? (array_key_exists('produit_name', $requestContent) ? $requestContent['produit_name'] : null);
// Recherche de l'utilisateur et du produit
$user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
$produit = $this->em->getRepository(Produit::class)->findOneBy(['name' => $produitName]);
if (empty($user) || empty($produit)) {
return new JsonResponse(['message' => 'Bad Request', 'error' => ['Utilisateur ou produit inconnu.']], 400);
}
if ($produitName === 'NOSE') {
$this->userManager->resetPasswordForNose($username);
} else {
// JAZ 237 - reset password false
$token = $this->userManager->resetPasswordForProduit($username, false);
$organisation = $user->getDepartment()->getBranch();
$parameters = [
'token' => $token,
'username' => $user->getUsername(),
'nom' => $user->getLastname() . ' ' . $user->getFirstname(),
'email' => $user->getEmail(),
'ste' => $organisation->getMnemonique(),
];
$connector->sendRequestToProduit($produit, $parameters, 'GET', $produit->getResetPasswordUrl() ?? 'user/pass/reset');
}
return new JsonResponse(['message' => 'Ok']);
}
/**
* @Route("/password/edit", name="password_edit")
*/
public function changePassword(Request $request): ?JsonResponse
{
$requestContent = $this->getRequestArray($request);
$username = $request->get('username') ?? (array_key_exists('username', $requestContent) ? $requestContent['username'] : null);
$token = $request->get('token') ?? (array_key_exists('username', $requestContent) ? $requestContent['token'] : null);
$plainPassword1 = $request->get('password1') ?? (array_key_exists('password1', $requestContent) ? $requestContent['password1'] : null);
$plainPassword2 = $request->get('password2') ?? (array_key_exists('password2', $requestContent) ? $requestContent['password2'] : null);
$oldPlainPassword = $request->get('old_password') ?? (array_key_exists('old_password', $requestContent) ? $requestContent['old_password'] : null);
// Recherche de l'utilisateur
$user = $this->userManager->getRepository()->findOneBy(['username' => $username, 'deletedAt' => null]);
if (empty($user)) return new JsonResponse(['message' => 'Bad Request', 'error' => ['Utilisateur inconnu.']], 400);
if ($token !== $user->getToken()) return new JsonResponse(['message' => 'Bad Request', 'error' => ['Votre lien est arrivé à expiration. Veuillez renouveler votre demande.']], 400);
if (is_null($oldPlainPassword) or is_null($plainPassword1) or is_null($plainPassword2)) {
$result = ['Paramètres manquants'];
} else {
$result = $this->userManager->updatePasswordByUser($user, $oldPlainPassword, $plainPassword1, $plainPassword2);
}
if (is_array($result)) {
return new JsonResponse(['message' => 'Bad Request', 'error' => $result], 400);
} elseif ($result instanceof User) {
$user = $this->userManager->updatePassword($user, $plainPassword1);
$this->userManager->resetEchec($user);
return new JsonResponse(['message' => 'OK', 'new_token' => $user->getToken()]);
}
return new JsonResponse(['message' => 'Internal Server Error'], 500);
}
/**
* @Route ("/droit", name="droit")
*/
public function getDroit(Request $request): JsonResponse
{
$userToken = $request->get('userToken');
$produitName = $request->get('produit');
$droitCode = $request->get('codeDroit');
if (empty($userToken) || empty($produitName)) return new JsonResponse(['message' => 'Paramètre manquant'], 204);
$profilsDroits = $this->em->getRepository(ProfilDroit::class)->findForApi($userToken, $produitName, $droitCode);
$profilsDroitsResult = [];
if (!empty($profilsDroits)) {
foreach ($profilsDroits as $profilDroit) {
$droit = $profilDroit->getDroit();
$listCrude = [];
if (isset($profilsDroitsResult[$droit->getCode()])) {
$listCrude = $profilsDroitsResult[$droit->getCode()];
}
$profilsDroitsResult[$droit->getCode()] = $this->formatProfilDroit($profilDroit, $listCrude);
}
}
return new JsonResponse(['message' => 'ok', 'droit' => $profilsDroitsResult]);
}
/**
* @Route ("/perimetre", name="perimetre")
*/
public function getPerimetre(Request $request): ?JsonResponse
{
$userToken = $request->get('userToken');
$produitName = $request->get('produit');
if (empty($userToken) || empty($produitName)) return new JsonResponse(['message' => 'Paramètre manquant'], 204);
$perimetres = $this->em->getRepository(Perimetre::class)->findForApi($userToken, $produitName);
$perimetreResult = $this->perimetreManager->getPerimetreByType($perimetres);
return new JsonResponse(['message' => 'ok', 'perimetre' => $perimetreResult]);
}
/**
* @Route("/entitesFacturation/{mnemoProprietaire}/{mnemoClient}", name="entite_facturation", methods={"GET"})
*/
public function getEntitesFacturation(string $mnemoProprietaire, string $mnemoClient): ?JsonResponse
{
$proprietaire = $this->em->getRepository(Proprietaire::class)->findOneBy(['code' => $mnemoProprietaire]);
$client = $this->em->getRepository(Branch::class)->getBranchByMnemonique($mnemoClient, $proprietaire);
if ($client instanceof BranchAdresse) {
$client = $client->getBranch();
}
$entiteFacturationList = [];
if ($client && $client->getAdresses('factu', false)) {
/** @var BranchAdresse $adress */
foreach ($client->getAdresses('factu', false) as $adress) {
$filteredArray = $adress->getProprietaires()->filter(
function (Proprietaire $p) use ($proprietaire) {
return $p->getId() === $proprietaire->getId();
}
);
if (!$filteredArray->isEmpty()) {
$entiteFacturationList[] = $adress->format(false, true);
}
}
}
return new JsonResponse($entiteFacturationList);
}
/**
* @Route("/entite/factu", name="entite_factu", methods={"GET"})
*/
public function getEntiteFactu(): JsonResponse
{
$addresses = $this->em->getRepository(BranchAdresse::class)->findBy(['type' => 'factu']);
$entiteFacturationList = [];
/** @var BranchAdresse $adress */
foreach ($addresses as $adress) {
$entiteFacturationList[] = $adress->format(false, true);
}
return new JsonResponse($entiteFacturationList);
}
/**
* @Route("/get/clients/proprietaire/{proprietaire}", name="search_client_by_proprietaire", methods={"GET"})
*/
public function getClientsByProprietaire(string $proprietaire): JsonResponse
{
return new JsonResponse($this->em->getRepository(BranchProprietaire::class)->getElementByElement('bp.mnemonique', 'p.code', $proprietaire));
}
/**
* @Route("/get/clients/mnemonique/{mnemonique}", name="search_client_by_mnemonique", methods={"GET"})
*/
public function getClientByMnemonique(string $mnemonique): Response
{
return new JsonResponse($this->em->getRepository(Branch::class)->getElementByElement('b.mnemonique', 'bp.mnemonique', $mnemonique));
}
/**
* @Route("/get/proprietaire/mnemonique/{mnemonique}", name="search_proprietaire_by_mnemonique", methods={"GET"})
*/
public function getProprietairesByMnemonique(string $mnemonique): Response
{
return new JsonResponse($this->em->getRepository(Branch::class)->getElementByElement('p.code', 'bp.mnemonique', $mnemonique));
}
/**
* @Route("/get/proprietaires/client/{client}", name="search_proprietaire_by_client", methods={"GET"})
*/
public function getProprietairesByClient(string $client): Response
{
return new JsonResponse($this->em->getRepository(Branch::class)->getElementByElement('p.code', 'b.mnemonique', $client));
}
/**
* @Route("/interlocuteur/{proprietaire}/{cliCode}/{cliCodeFactu}", name="entite_facturation_interlocuteur", methods={"GET"}, defaults={"cliCodeFactu"=null})
*/
public function getInterlocuteurByClientProprietaire(string $proprietaire, string $cliCode, ?string $cliCodeFactu): Response
{
$users = $this->userManager->getRepository()->getInterlocuteurByEntiteFacturation($proprietaire, $cliCode, $cliCodeFactu);
$data = [];
/** @var User $user */
foreach ($users as $user) {
$data[] = [
'id' => $user['id'],
'firstName' => $user['firstname'],
'lastName' => $user['lastname'],
'codeInterlocuteur' => $user['codeInterlocuteur']
];
}
return new JsonResponse($data);
}
/**
* @Route("/switch/{username}/{produit}", name="switch_user", methods={"GET"})
*/
public function switchUser(string $username, string $produit, ProduitRepository $produitRepository, Security $security): JsonResponse
{
$user = $this->userManager->getRepository()->findByUsername($username);
$error = '';
$url = '';
if (is_null($user)) {
$user = $this->userManager->getRepository()->findOneBy(['email' => $username, 'deletedAt' => null]);
}
if ($user) {
$userDepartment = $user->getDepartment();
$userBranch = $userDepartment->getBranch();
$produitRequest = $this->checkProduit($produit, $user, $userDepartment, $userBranch);
if (is_string($produitRequest)) {
$error = $this->returnBadAuthentication($produitRequest);
} else {
[$url, $error] = $this->userManager->getSwitchUrl($user, $produitRepository->findOneBy(['name' => $produit]), $security->getUser());
}
} else {
$error = "L'utilisateur demandé n'existe pas.";
}
return new JsonResponse(['url' => $url, 'error' => $error, 'success' => $error ? '' : 'URL trouvée']);
}
private function formatProfilDroit(ProfilDroit $profilDroit, array $previousProfilDroitFormat = []): array
{
$droit = $profilDroit->getDroit();
$result = [
"label" => $droit->getName(),
"c" => $profilDroit->getHasCreate() ? 1 : 0,
"r" => $profilDroit->getHasRead() ? 1 : 0,
"u" => $profilDroit->getHasUpdate() ? 1 : 0,
"d" => $profilDroit->getHasDelete() ? 1 : 0,
"e" => $profilDroit->getHasExecute() ? 1 : 0,
];
foreach ($previousProfilDroitFormat as $key => $value) {
if ($key !== 'label') {
$result[$key] = ($value || $result[$key]) ? 1 : 0;
}
}
return $result;
}
private function returnBadAuthentication($message = ""): ?JsonResponse
{
return new JsonResponse(['message' => "Erreur d'authentification ({$message})"], 401);
}
private function returnExpiredPassword(User $user, ?string $produit): ?JsonResponse
{
if ($produit === 'NOSE') $this->userManager->resetPasswordForNose($user->getUsername());
return new JsonResponse([
'message' => "Erreur d'authentification (Mot de passe expiré)",
'code' => 'EXPIRED',
'token' => $user->getToken(),
'resetToken' => $user->getResetToken()
], 401);
}
private function returnEchecPassword(User $user, ?string $produit): ?JsonResponse
{
if ($produit === 'NOSE') $this->userManager->resetPasswordForNose($user->getUsername());
return new JsonResponse([
'message' => "Erreur d'authentification (echec_password)",
'code' => 'ECHEC',
'token' => $user->getToken()
], 401);
}
}