src/Controller/Api/UserController.php line 220

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator;
  4. use App\Enum\ActivityLogCategoryEnum;
  5. use App\Enum\ActivityLogMethodEnum;
  6. use App\Enum\OrganizationStatusEnum;
  7. use App\Enum\SubscriptionPackEnum;
  8. use App\Repository\LetterRepository;
  9. use App\Repository\OrganizationRepository;
  10. use App\Repository\UserRepository;
  11. use App\Service\SubscriptionUtils;
  12. use App\Utils\SegmentUtils;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Doctrine\ORM\ORMException;
  15. use Evo\Infrastructure\MappingORM\ActivityLog;
  16. use Evo\Infrastructure\MappingORM\Letter;
  17. use Evo\Infrastructure\MappingORM\Organization;
  18. use Evo\Infrastructure\MappingORM\User;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
  25. use Symfony\Component\Security\Core\Security;
  26. /**
  27.  * @Route("/user")
  28.  */
  29. class UserController extends AbstractController
  30. {
  31.     private EntityManagerInterface $em;
  32.     private Security $security;
  33.     private SubscriptionUtils $subscriptionUtils;
  34.     public function __construct(
  35.         EntityManagerInterface $entityManager,
  36.         Security $security,
  37.         SubscriptionUtils $subscriptionUtils
  38.     ) {
  39.         $this->em $entityManager;
  40.         $this->security $security;
  41.         $this->subscriptionUtils $subscriptionUtils;
  42.     }
  43.     /**
  44.      * @Route("/{user_id}/get-organizations-list", name="app_user_organizations_list", methods={"GET"})
  45.      *
  46.      * @return JsonResponse
  47.      */
  48.     public function getOrganizationsByUserId($user_id)
  49.     {
  50.         /** @var UserRepository $userRepository */
  51.         $userRepository $this->em->getRepository(User::class);
  52.         /** @var OrganizationRepository $organizationRepository */
  53.         $organizationRepository $this->em->getRepository(Organization::class);
  54.         $organizationList = [];
  55.         if (is_numeric($user_id)) {
  56.             $organizations $userRepository->getOrganizationsList($user_id);
  57.             foreach ($organizations as $organizationID) {
  58.                 $organization $organizationRepository->find($organizationID);
  59.                 if (null !== $organization) {
  60.                     $subscription SubscriptionUtils::getDomSubscription($organization);
  61.                     $organizationList[] = [
  62.                         'id' => $organization->getId(),
  63.                         'legalName' => $organization->getLegalName(),
  64.                         'status' => $organization->getStatus(),
  65.                         'statusInvoicePayed' => $organization->getStatusInvoicePayed(),
  66.                         'dateMaxUnpaid' => $organization->getDateMaxUnpaid(),
  67.                         'uniqId' => $organization->getUniqId(),
  68.                         'terminationReason' => $organization->getTerminationReason(),
  69.                         'terminationDate' => $organization->getTerminationDate(),
  70.                         'invoiceToken' => $organization->getInvoiceToken(),
  71.                         'isNewDomiciliation' => $organization->getIsNewDomiciliation(),
  72.                         'isNewImmatriculation' => $organization->getIsNewImmatriculation(),
  73.                         'statusImmatriculation' => $organization->getStatusImmatriculation(),
  74.                         'domiciliationStartDate' => $organization->getDomiciliationStartDate(),
  75.                         'historyNavTunnel' => $organization->getHistoryNavTunnel(),
  76.                         'subscription_id' => null !== $subscription $subscription->getId() : null,
  77.                         'isInvalidEmail' => $organization->getIsInvalidEmail(),
  78.                         'blockingReason' => null !== $subscription $subscription->getBlockingReason() : null,
  79.                         'isInvalidPhoneNumber' => $organization->getIsInvalidPhoneNumber(),
  80.                         'hasServiceBlocked' => $subscription && $subscription->isHasBlockedService(),
  81.                     ];
  82.                 }
  83.             }
  84.             return $this->json($organizationList);
  85.         }
  86.         throw new \InvalidArgumentException('No user found.');
  87.     }
  88.     /**
  89.      * @Route(
  90.      *     name="app_user_letters_list",
  91.      *     path="/{user_id}/get-letters-list",
  92.      *     defaults={
  93.      *         "_api_resource_class"=Letter::class,
  94.      *         "_api_collection_operation_name"="get"
  95.      *     }
  96.      * )
  97.      *
  98.      * @return Paginator
  99.      */
  100.     public function getLettersByUserId(Request $requestLetterRepository $letterRepository$user_idint $page 1)
  101.     {
  102.         if (is_numeric($user_id)) {
  103.             $page = (int) $request->query->get('page'1);
  104.             return $letterRepository->getLettersByOrganization($user_id$page);
  105.         }
  106.         throw new \InvalidArgumentException('No user found.');
  107.     }
  108.     /**
  109.      * @Route("/{user_id}/get-active-organizations-list", name="app_user_active_organizations", methods={"GET"})
  110.      *
  111.      * @return JsonResponse
  112.      */
  113.     public function countActiveOrganizations($user_id)
  114.     {
  115.         $count 0;
  116.         $list = [];
  117.         /** @var User $user */
  118.         $user $this->em->getRepository(User::class)->findOneBy(['id' => $user_id]);
  119.         if ($user) {
  120.             foreach ($user->getOrganizations() as $organization) {
  121.                 if (!in_array($organization->getStatus(), [
  122.                     OrganizationStatusEnum::NEW,
  123.                     OrganizationStatusEnum::LOST,
  124.                     OrganizationStatusEnum::CANCELLED,
  125.                 ])) {
  126.                     ++$count;
  127.                 } elseif (OrganizationStatusEnum::NEW === $organization->getStatus() &&
  128.                     $organization->getStatusImmatriculation() &&
  129.                     OrganizationStatusEnum::NEW !== $organization->getStatusImmatriculation()
  130.                 ) {
  131.                     ++$count;
  132.                 }
  133.             }
  134.             return $this->json([
  135.                 'count' => $count,
  136.                 'list' => $list,
  137.             ]);
  138.         }
  139.         return $this->json([
  140.             'error' => 'User not found',
  141.         ]);
  142.     }
  143.     /**
  144.      * @Route(
  145.      *     "/{id}/unlink/organization",
  146.      *     name="app_user_unlink_organization",
  147.      *     methods={"POST"}
  148.      *     )
  149.      *
  150.      * @throws ORMException
  151.      * @throws \JsonException
  152.      */
  153.     public function unLinkToOrgananization(int $idRequest $request): JsonResponse
  154.     {
  155.         $query json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  156.         $user $this->em->getReference(User::class, $id);
  157.         $organizationId $query['organizationId'];
  158.         if (null === $organizationId) {
  159.             return new JsonResponse(['message' => 'OrganizationId is required'], Response::HTTP_BAD_REQUEST);
  160.         }
  161.         $organization $this->em->getReference(Organization::class, $organizationId);
  162.         if (!$organization || !$user) {
  163.             return new JsonResponse(['message' => 'User or organization not found'], Response::HTTP_NOT_FOUND);
  164.         }
  165.         $token $this->security->getToken();
  166.         if ($token instanceof SwitchUserToken) {
  167.             $impersonatorUser $token->getOriginalToken()->getUser();
  168.         }
  169.         $userActivityLog $impersonatorUser ?? $this->security->getUser();
  170.         $activityLog ActivityLog::create(
  171.             $userActivityLog,
  172.             ActivityLogMethodEnum::REMOVE,
  173.             'SUPPRESSION USER ID: '.$id,
  174.             ActivityLogCategoryEnum::USER,
  175.             [],
  176.             $organization,
  177.             null,
  178.             $user->getFullName()
  179.         );
  180.         $organization->removeUser($user);
  181.         try {
  182.             $this->em->persist($activityLog);
  183.             $this->em->persist($organization);
  184.             $this->em->flush();
  185.         } catch (\Exception $exception) {
  186.             return new JsonResponse(['message' => 'An error occured when trying to dissociate user of organization'], Response::HTTP_OK);
  187.         }
  188.         return new JsonResponse(['message' => 'User dissociate to the organization'], Response::HTTP_OK);
  189.     }
  190.     /**
  191.      * @Route("/{user_id}/get-main-pack", name="app_user_main_pack", methods={"GET"})
  192.      */
  193.     public function getUserMainPack($user_id): JsonResponse
  194.     {
  195.         /** @var User $user */
  196.         $user $this->em->getRepository(User::class)->findOneBy(['id' => $user_id]);
  197.         if ($user) {
  198.             $packsPriorities = [
  199.                 SubscriptionPackEnum::DOMISIMPLE => 1,
  200.                 SubscriptionPackEnum::DOMISCAN => 2,
  201.                 SubscriptionPackEnum::DIGIPACK => 3,
  202.                 SubscriptionPackEnum::SCANPACK => 4,
  203.                 SubscriptionPackEnum::COMPTAPACK => 5,
  204.             ];
  205.             $mainPack '';
  206.             foreach ($user->getOrganizations() as $organization) {
  207.                 $subscription SubscriptionUtils::getDomSubscription($organization);
  208.                 $pack $this->subscriptionUtils->getPackUniqueKey($subscription);
  209.                 if ('' !== $pack && (empty($mainPack)
  210.                 || (
  211.                     isset($packsPriorities[$mainPack], $packsPriorities[$pack])
  212.                     && $packsPriorities[$mainPack] < $packsPriorities[$pack]
  213.                 ))) {
  214.                     $mainPack $pack;
  215.                 }
  216.             }
  217.             $mainPack = empty($mainPack) ? '' SegmentUtils::PACK_LABELS[mb_strtoupper($mainPack)];
  218.             return $this->json([
  219.                 'main_pack' => $mainPack,
  220.             ]);
  221.         }
  222.         return $this->json([
  223.             'error' => 'User not found',
  224.         ]);
  225.     }
  226.     /**
  227.      * @Route("/find-by-email", name="app_user_find_by_email", methods={"POST"})
  228.      *
  229.      * @return JsonResponse
  230.      */
  231.     public function findByEmail(Request $request)
  232.     {
  233.         $query json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  234.         $email $query['email'];
  235.         /** @var User $user */
  236.         $user $this->em->getRepository(User::class)->findOneBy(['email' => $email]);
  237.         if ($user) {
  238.             return $this->json([
  239.                 'success' => true,
  240.                 'id' => $user->getId(),
  241.                 'uniqId' => $user->getUniqId(),
  242.             ]);
  243.         }
  244.         return $this->json([
  245.             'success' => false,
  246.         ]);
  247.     }
  248.     /**
  249.      * @Route("/get-organization-by-user", name="app_organizations_by_user", methods={"GET"})
  250.      *
  251.      * @return JsonResponse
  252.      */
  253.     public function getOrganizationsByUserEmail()
  254.     {
  255.         /** @var UserRepository $userRepository */
  256.         $userRepository $this->em->getRepository(User::class);
  257.         /** @var OrganizationRepository $organizationRepository */
  258.         $organizationRepository $this->em->getRepository(Organization::class);
  259.         $organizationList = [];
  260.         if ($this->getUser()) {
  261.             $organizations $userRepository->getOrganizationsByUser($this->getUser()->getUsername());
  262.             foreach ($organizations as $organizationID) {
  263.                 $organization $organizationRepository->find($organizationID);
  264.                 if (null !== $organization) {
  265.                     $organizationList[] = [
  266.                         'id' => $organization->getId(),
  267.                         'legalName' => $organization->getLegalName(),
  268.                     ];
  269.                 }
  270.             }
  271.             return $this->json($organizationList);
  272.         }
  273.         return new JsonResponse(['error' => 'No user found.'], Response::HTTP_NOT_FOUND);
  274.     }
  275. }