src/Aqarmap/Bundle/UserBundle/Controller/Api/UserController.php line 1956

Open in your IDE?
  1. <?php
  2. namespace Aqarmap\Bundle\UserBundle\Controller\Api;
  3. use App\Entity\Lead\Lead;
  4. use App\Exception\BadRequestHttpException;
  5. use App\Message\User\UpdateProfileMessage;
  6. use App\Service\Security\AuthServer;
  7. use App\Service\User\SubAccountService;
  8. use Aqarmap\Bundle\CreditBundle\Contract\CreditManagerInterface;
  9. use Aqarmap\Bundle\CreditBundle\Repository\CreditRepository;
  10. use Aqarmap\Bundle\FeatureToggleBundle\Service\FeatureToggleManager;
  11. use Aqarmap\Bundle\ListingBundle\Constant\LeadTypes;
  12. use Aqarmap\Bundle\ListingBundle\Constant\ListingRateConstant;
  13. use Aqarmap\Bundle\ListingBundle\Contracts\PhoneManagerInterface;
  14. use Aqarmap\Bundle\ListingBundle\Entity\Listing;
  15. use Aqarmap\Bundle\ListingBundle\Entity\ListingLead;
  16. use Aqarmap\Bundle\ListingBundle\Entity\Phone;
  17. use Aqarmap\Bundle\ListingBundle\Entity\UserPhone;
  18. use Aqarmap\Bundle\ListingBundle\Repository\ListingRepository;
  19. use Aqarmap\Bundle\ListingBundle\Service\FavouriteService;
  20. use Aqarmap\Bundle\ListingBundle\Service\LeadService;
  21. use Aqarmap\Bundle\ListingBundle\Service\ListingManager;
  22. use Aqarmap\Bundle\ListingBundle\Service\ListingRateService;
  23. use Aqarmap\Bundle\ListingBundle\Service\TopCustomerService;
  24. use Aqarmap\Bundle\MainBundle\Contract\ProducerFactoryInterface;
  25. use Aqarmap\Bundle\MainBundle\Controller\Api\BaseController;
  26. use Aqarmap\Bundle\UserBundle\Constant\Age;
  27. use Aqarmap\Bundle\UserBundle\Constant\Education;
  28. use Aqarmap\Bundle\UserBundle\Constant\Gender;
  29. use Aqarmap\Bundle\UserBundle\Constant\Industry;
  30. use Aqarmap\Bundle\UserBundle\Constant\MaritalStatus;
  31. use Aqarmap\Bundle\UserBundle\Constant\Position;
  32. use Aqarmap\Bundle\UserBundle\Constant\PurchaseInfo;
  33. use Aqarmap\Bundle\UserBundle\Constant\UserCheckinSource;
  34. use Aqarmap\Bundle\UserBundle\Entity\PersonalInfo;
  35. use Aqarmap\Bundle\UserBundle\Entity\SavedSearch;
  36. use Aqarmap\Bundle\UserBundle\Entity\User;
  37. use Aqarmap\Bundle\UserBundle\Entity\UserNote;
  38. use Aqarmap\Bundle\UserBundle\Entity\UserPackages;
  39. use Aqarmap\Bundle\UserBundle\Form\AddUserPhoneFormType;
  40. use Aqarmap\Bundle\UserBundle\Form\PersonalInfoType;
  41. use Aqarmap\Bundle\UserBundle\Form\QuickRegistrationFormType;
  42. use Aqarmap\Bundle\UserBundle\Form\RegistrationFormType;
  43. use Aqarmap\Bundle\UserBundle\Form\UpdateCompanyInfoFormType;
  44. use Aqarmap\Bundle\UserBundle\Form\UpdateProfileBasicInfoFormType;
  45. use Aqarmap\Bundle\UserBundle\Form\UpdateProfileFormType;
  46. use Aqarmap\Bundle\UserBundle\Form\UserPhoneType;
  47. use Aqarmap\Bundle\UserBundle\Repository\UserPackagesRepository;
  48. use Aqarmap\Bundle\UserBundle\Repository\UserRepository;
  49. use Aqarmap\Bundle\UserBundle\Services\Contracts\UserCheckinHistoryServiceInterface;
  50. use Aqarmap\Bundle\UserBundle\Services\Contracts\UserIpInfoServiceInterface;
  51. use Aqarmap\Bundle\UserBundle\Services\Contracts\UserPhoneManagerInterface;
  52. use Aqarmap\Bundle\UserBundle\Services\SavedSearchManager;
  53. use Aqarmap\Bundle\UserBundle\Services\UserActivityService;
  54. use Aqarmap\Bundle\UserBundle\Services\UserManager;
  55. use Aqarmap\Bundle\UserBundle\Services\V3\UserInfoService;
  56. use Doctrine\ORM\EntityManagerInterface;
  57. use Doctrine\ORM\QueryBuilder;
  58. use FOS\RestBundle\Controller\Annotations as Rest;
  59. use FOS\RestBundle\View\View;
  60. use FOS\UserBundle\Event\FormEvent;
  61. use FOS\UserBundle\Event\GetResponseUserEvent;
  62. use FOS\UserBundle\FOSUserEvents;
  63. use FOS\UserBundle\Mailer\MailerInterface;
  64. use FOS\UserBundle\Model\UserManagerInterface;
  65. use FOS\UserBundle\Util\TokenGeneratorInterface;
  66. use JMS\Serializer\SerializationContext;
  67. use JMS\Serializer\SerializerInterface;
  68. use Knp\Component\Pager\PaginatorInterface;
  69. use Nelmio\ApiDocBundle\Annotation\Model;
  70. use Nelmio\ApiDocBundle\Annotation\Operation;
  71. use OpenApi\Annotations as OA;
  72. use Predis\ClientInterface as RedisClient;
  73. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  74. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  75. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  76. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  77. use Symfony\Component\Form\FormFactoryInterface;
  78. use Symfony\Component\HttpFoundation\Request;
  79. use Symfony\Component\HttpFoundation\Response;
  80. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  81. use Symfony\Component\Messenger\MessageBusInterface;
  82. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  83. use Symfony\Contracts\Translation\TranslatorInterface;
  84. class UserController extends BaseController
  85. {
  86.     public const FIRST_PAGE_NUMBER 1;
  87.     public const SUB_ACCOUNTS_LIMIT 20;
  88.     private UserManager $userManager;
  89.     /**
  90.      * @var ListingManager
  91.      */
  92.     private $listingManager;
  93.     /**
  94.      * @var CreditManagerInterface
  95.      */
  96.     private $creditManager;
  97.     /**
  98.      * @var PhoneManagerInterface
  99.      */
  100.     private $phoneManager;
  101.     /**
  102.      * @var EventDispatcherInterface
  103.      */
  104.     private $eventDispatcher;
  105.     /**
  106.      * @var EntityManagerInterface
  107.      */
  108.     private $entityManager;
  109.     /**
  110.      * @var PaginatorInterface
  111.      */
  112.     private $paginator;
  113.     /**
  114.      * @var ListingRateService
  115.      */
  116.     private $listingRateService;
  117.     /**
  118.      * @var LeadService
  119.      */
  120.     private $leadService;
  121.     /**
  122.      * @var SavedSearchManager
  123.      */
  124.     private $savedSearchManager;
  125.     /**
  126.      * @var TranslatorInterface
  127.      */
  128.     private $translator;
  129.     /**
  130.      * @var FavouriteService
  131.      */
  132.     private $favouriteService;
  133.     /**
  134.      * @var UserCheckinHistoryServiceInterface
  135.      */
  136.     private $userCheckinHistoryServiceInterface;
  137.     /**
  138.      * @var UserManagerInterface
  139.      */
  140.     private $fosUserManager;
  141.     /** @var TokenStorageInterface */
  142.     private $tokenStorage;
  143.     /** @var CreditRepository */
  144.     private $creditRepository;
  145.     /** @var UserRepository */
  146.     private $userRepository;
  147.     private UserPhoneManagerInterface $userPhoneManager;
  148.     private $listingRepository;
  149.     /** @var UserPackagesRepository */
  150.     private $userPackagesRepository;
  151.     private UserInfoService $userInfoService;
  152.     public function __construct(
  153.         EntityManagerInterface $entityManager,
  154.         PaginatorInterface $paginator,
  155.         EventDispatcherInterface $eventDispatcher,
  156.         TokenGeneratorInterface $tokenGenerator,
  157.         FormFactoryInterface $fosFormFactory,
  158.         SerializerInterface $jmsSerializer,
  159.         RedisClient $redis,
  160.         FeatureToggleManager $featureToggleManager,
  161.         TranslatorInterface $translator,
  162.         ProducerFactoryInterface $producerFactory,
  163.         TopCustomerService $topCustomerService,
  164.         ListingManager $listingManager,
  165.         LeadService $leadService,
  166.         CreditManagerInterface $creditManager,
  167.         SavedSearchManager $savedSearchManager,
  168.         FavouriteService $favouriteService,
  169.         ListingRateService $listingRateService,
  170.         UserCheckinHistoryServiceInterface $userCheckinHistoryServiceInterface,
  171.         PhoneManagerInterface $phoneManager,
  172.         MailerInterface $fosUserMailer,
  173.         UserActivityService $userActivityService,
  174.         UserManagerInterface $fosUserManager,
  175.         UserManager $userManager,
  176.         TokenStorageInterface $tokenStorage,
  177.         CreditRepository $creditRepository,
  178.         UserRepository $userRepository,
  179.         ParameterBagInterface $parameterBag,
  180.         UserPhoneManagerInterface $userPhoneManager,
  181.         ListingRepository $listingRepository,
  182.         UserPackagesRepository $userPackagesRepositoryUserInfoService $userInfoService
  183.     ) {
  184.         $this->entityManager $entityManager;
  185.         $this->paginator $paginator;
  186.         $this->eventDispatcher $eventDispatcher;
  187.         $this->userManager $userManager;
  188.         $this->favouriteService $favouriteService;
  189.         $this->leadService $leadService;
  190.         $this->savedSearchManager $savedSearchManager;
  191.         $this->listingManager $listingManager;
  192.         $this->creditManager $creditManager;
  193.         $this->phoneManager $phoneManager;
  194.         $this->translator $translator;
  195.         $this->listingRateService $listingRateService;
  196.         $this->fosUserManager $fosUserManager;
  197.         $this->userCheckinHistoryServiceInterface $userCheckinHistoryServiceInterface;
  198.         $this->tokenStorage $tokenStorage;
  199.         $this->creditRepository $creditRepository;
  200.         $this->userRepository $userRepository;
  201.         $this->userPhoneManager $userPhoneManager;
  202.         $this->listingRepository $listingRepository;
  203.         $this->userPackagesRepository $userPackagesRepository;
  204.         $this->userInfoService $userInfoService;
  205.     }
  206.     /**
  207.      * Get User.
  208.      *
  209.      * @Operation(
  210.      *     tags={"User"},
  211.      *     summary="Get User.",
  212.      *
  213.      * )
  214.      *
  215.      * @Rest\Get("/api/v2/user", options={"i18n" = false, "expose"=true}, name="aqarmap_api_get_current_user_v2")
  216.      *
  217.      * @Rest\View(serializerGroups={"Default", "Details", "UpdateProfile"})
  218.      *
  219.      * @Security("is_granted('ROLE_USER')")
  220.      */
  221.     public function user(): array
  222.     {
  223.         return [
  224.             'user' => $this->getUser(),
  225.             'balance' => (string) $this->userPackagesRepository->getTotalCreditsByUser($this->getUser()),
  226.         ];
  227.     }
  228.     /**
  229.      * @Rest\Get("/api/users", requirements={"id":"\d+"}, options={"expose" = true, "i18n" = false}, name="aqarmap_api_get_all_users")
  230.      *
  231.      * @Rest\View(serializerGroups={"Default", "Details"})
  232.      *
  233.      * @Security("is_granted('ROLE_ADMIN')")
  234.      *
  235.      * @return View
  236.      */
  237.     public function getUsers(Request $request)
  238.     {
  239.         if (empty($request->query->get('term'))) {
  240.             return View::create()->setData(['users' => []]);
  241.         }
  242.         /** @var QueryBuilder $query */
  243.         $query $this->entityManager->getRepository(User::class)->search([
  244.             'q' => $request->query->get('term'),
  245.             'search' => 'listing_owner_menu',
  246.         ]);
  247.         $query->setMaxResults(5);
  248.         $users $query->getQuery()->getResult();
  249.         $usersData = [];
  250.         /** @var User $user */
  251.         foreach ($users as $user) {
  252.             @array_push($usersData, ['title' => $user->getEmailCanonical(), 'id' => $user->getId(), 'username' => $user->getUsername()]);
  253.         }
  254.         return View::create()->setData(['users' => $usersData]);
  255.     }
  256.     /**
  257.      * Create an account.
  258.      *
  259.      * @Operation(
  260.      *     tags={"User"},
  261.      *     summary="Create an account.",
  262.      *
  263.      *     @OA\Parameter(
  264.      *         name="register",
  265.      *          in="query",
  266.      *         description="",
  267.      *         required=false,
  268.      *     ),
  269.      *
  270.      * )
  271.      *
  272.      * @Rest\Post("/api/v2/user/quick-registration", options={"i18n" = false}, name="aqarmap_api_create_user_v2")
  273.      *
  274.      * @Rest\View(serializerGroups = {"Default", "Details"})
  275.      */
  276.     public function createUser(Request $request)
  277.     {
  278.         $userManager $this->fosUserManager;
  279.         $user $userManager->createUser();
  280.         $form $this->createForm(QuickRegistrationFormType::class, $user, [
  281.             'method' => 'POST',
  282.             'csrf_protection' => false,
  283.         ]);
  284.         $form->handleRequest($request);
  285.         if ($form->isSubmitted() && $form->isValid()) {
  286.             // Register user
  287.             $user $this->userManager->quickRegistration($form$user$request);
  288.             // Return user
  289.             return ['user' => $user];
  290.         } elseif ($userEntity $userManager->findUserByEmail($form->get('email')->getData())) {
  291.             // If user has 00000 as a phone number, then update his data, otherwise don't update anything
  292.             if (preg_match('/^[0]+$/'$userEntity->getPhoneNumber())) {
  293.                 $userEntity->setPhoneNumber($form->get('phoneNumber')->getData());
  294.                 $userEntity->setFullName($form->get('fullName')->getData());
  295.                 $userManager->updateUser($userEntity);
  296.             }
  297.             return ['user' => $userEntity];
  298.         }
  299.         return $form;
  300.     }
  301.     /**
  302.      * Create a full user account.
  303.      *
  304.      * @Operation(
  305.      *     tags={"User"},
  306.      *     summary="Create a full user account.",
  307.      *
  308.      *     @OA\Parameter(
  309.      *         name="register",
  310.      *          in="query",
  311.      *         description="",
  312.      *         required=false,
  313.      *     ),
  314.      *
  315.      * )
  316.      *
  317.      * @Rest\Post("/api/v2/user", options={"i18n" = false}, name="aqarmap_api_create_new_user_v2")
  318.      *
  319.      * @Security("is_granted('ROLE_USER')")
  320.      *
  321.      * @Rest\View(serializerGroups = {"Default", "Details"})
  322.      */
  323.     public function createNewUser(Request $request)
  324.     {
  325.         $userManager $this->fosUserManager;
  326.         $dispatcher $this->eventDispatcher;
  327.         /** @var $user \Aqarmap\Bundle\UserBundle\Entity\User */
  328.         $user $userManager->createUser();
  329.         $form $this->createForm(RegistrationFormType::class, $user, [
  330.             'method' => 'POST',
  331.             'csrf_protection' => false,
  332.         ]);
  333.         $dispatcher->dispatch(new GetResponseUserEvent($user$request), FOSUserEvents::REGISTRATION_INITIALIZE);
  334.         $form->handleRequest($request);
  335.         if ($form->isSubmitted() && $form->isValid()) {
  336.             $user->setEnabled(true);
  337.             $dispatcher->dispatch(new FormEvent($form$request), FOSUserEvents::REGISTRATION_SUCCESS);
  338.             $userManager->updateUser($user);
  339.             return ['user' => $user];
  340.         }
  341.         return $form;
  342.     }
  343.     /**
  344.      * Get User Listings.
  345.      *
  346.      * @Operation(
  347.      *     tags={"User"},
  348.      *     summary="Get User Listings.",
  349.      *
  350.      *     @OA\Parameter(
  351.      *         name="page",
  352.      *         in="query",
  353.      *         description="Page number, starting from 1.",
  354.      *         required=false,
  355.      *     ),
  356.      *     @OA\Parameter(
  357.      *         name="limit",
  358.      *         in="query",
  359.      *         description="Number of items per page.",
  360.      *         required=false,
  361.      *     ),
  362.      *     @OA\Parameter(
  363.      *         name="orderBy",
  364.      *         in="query",
  365.      *         description="Sort search result by",
  366.      *         required=false,
  367.      *     ),
  368.      *     @OA\Parameter(
  369.      *         name="orderDirection",
  370.      *         in="query",
  371.      *         description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)",
  372.      *         required=false,
  373.      *     ),
  374.      *
  375.      * )
  376.      *
  377.      * @Rest\Get("/api/v2/user/{id}/listing", options={"i18n" = false}, name="aqarmap_api_get_user_lisings")
  378.      *
  379.      * @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
  380.      * @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
  381.      * @Rest\QueryParam(
  382.      *     name="orderBy", requirements="createdAt|publishedAt",
  383.      *     nullable=true, default="createdAt", description="Sort search result by"
  384.      * )
  385.      * @Rest\QueryParam(
  386.      *     name="orderDirection", requirements="ASC|DESC", nullable=true,
  387.      *     default="DESC", description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)"
  388.      * )
  389.      *
  390.      * @Rest\View(serializerGroups={"Default", "Details"})
  391.      *
  392.      * @return array
  393.      */
  394.     public function getUserListings(User $userRequest $request)
  395.     {
  396.         $em $this->entityManager;
  397.         $criteria = [];
  398.         $orderDirection 'ASC' == strtoupper($request->query->get('orderDirection')) ? 'ASC' 'DESC';
  399.         $orderByParam $request->query->get('orderBy');
  400.         $orderBy = (
  401.             \in_array(
  402.                 $orderByParam,
  403.                 [
  404.                     'createdAt',
  405.                     'publishedAt',
  406.                 ]
  407.             )
  408.         )
  409.             ? $orderByParam
  410.             'createdAt';
  411.         if (!empty($orderByParam)) {
  412.             $criteria['orderBy'] = [
  413.                 'l.'.$orderBy => $orderDirection,
  414.             ];
  415.         }
  416.         $query $em->getRepository(Listing::class)->getUserListings($user$criteria);
  417.         // Creating pagination
  418.         $listings $this->paginator->paginate(
  419.             $query,
  420.             $request->query->get('page'1),
  421.             $request->query->get('limit'10)
  422.         );
  423.         return [
  424.             'listings' => $listings,
  425.             'user' => $user,
  426.         ];
  427.     }
  428.     /**
  429.      * Get My Listings Tabs.
  430.      *
  431.      * @Operation(
  432.      *     tags={"User"},
  433.      *     summary="Get My Listings Tabs.",
  434.      *
  435.      * )
  436.      *
  437.      * @Rest\Get("/api/v2/user/listing/tabs", options={"i18n" = false}, name="aqarmap_api_get_listings_tabs")
  438.      *
  439.      * @Rest\View(serializerGroups={"Default", "Details", "Api"})
  440.      *
  441.      * @Security("is_granted('ROLE_USER')")
  442.      *
  443.      * @return array
  444.      */
  445.     public function getListingsTabs(Request $request)
  446.     {
  447.         $version = (float) ltrim((string) $request->headers->get('X-Accept-Version'), 'v');
  448.         $tabs $this->listingManager->myListingsTabs($version$this->getUser());
  449.         return [
  450.             'tabs' => $tabs,
  451.         ];
  452.     }
  453.     /**
  454.      * Get My Credit.
  455.      *
  456.      * @Operation(
  457.      *     tags={"User"},
  458.      *     summary="Get My Credit.",
  459.      *
  460.      *     @OA\Parameter(
  461.      *         name="page",
  462.      *         in="query",
  463.      *         description="Page number, starting from 1.",
  464.      *         required=false,
  465.      *     ),
  466.      *     @OA\Parameter(
  467.      *         name="limit",
  468.      *         in="query",
  469.      *         description="Number of items per page.",
  470.      *         required=false,
  471.      *     ),
  472.      *
  473.      * )
  474.      *
  475.      * @Rest\Get("/api/v2/user/credit", options={"i18n" = false}, name="aqarmap_api_get_my_credit")
  476.      *
  477.      * @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
  478.      * @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
  479.      *
  480.      * @Rest\View(serializerGroups={"Default", "List"})
  481.      *
  482.      * @Security("is_granted('ROLE_USER')")
  483.      *
  484.      * @return array
  485.      */
  486.     public function getMyCredit(Request $request)
  487.     {
  488.         $user $this->getUser();
  489.         return [
  490.             'credits' => $this->paginator->paginate(
  491.                 $this->creditRepository->listUserCreditQuery($user),
  492.                 $request->query->get('page'self::FIRST_PAGE_NUMBER),
  493.                 $request->query->get('limit'self::FIRST_PAGE_NUMBER)
  494.             ),
  495.             'balance' => (string) $this->userPackagesRepository->getTotalCreditsByUser($user),
  496.         ];
  497.     }
  498.     /**
  499.      * Get My Account.
  500.      *
  501.      * @Operation(
  502.      *     tags={"User"},
  503.      *     summary="Get My Account.",
  504.      *
  505.      * )
  506.      *
  507.      * @Rest\Get("/api/v2/user/account", options={"i18n" = false}, name="aqarmap_api_get_my_account")
  508.      *
  509.      * @Rest\View(serializerGroups={"Api", "List"})
  510.      *
  511.      * @Security("is_granted('ROLE_BROKER')")
  512.      *
  513.      * @Cache(expires="+1 days", maxage="+1 days", smaxage="+1 days", public=false, vary={"Accept-Language", "X-Accept-Version", "Accept"})
  514.      */
  515.     public function getMyAccount(EntityManagerInterface $emUserRepository $userRepoListingRepository $listingRepo): array
  516.     {
  517.         /** @var User $user */
  518.         $user $this->getUser();
  519.         $this->disableSoftDelete();
  520.         // Number of leads
  521.         $account['leads'] = [
  522.             'user' => $user,
  523.             'total_leads' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()]),
  524.             'show_phone' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()], LeadTypes::SHOW_PHONE),
  525.             'call_request' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()], LeadTypes::CALL_REQUEST),
  526.             'messages' => $em->getRepository(Lead::class)->getLeadsCount([$user->getId()], LeadTypes::SEND_MESSAGE),
  527.         ];
  528.         $this->enableSoftDelete();
  529.         // Number of customers
  530.         $account['customers'] = $userRepo->getUserCustomersCount($user);
  531.         // Number of Active listings [None draft or deleted]
  532.         $account['listings'] = (string) $listingRepo->getActiveUserListingsCount($user);
  533.         // Latest Credit
  534.         $account['credit'] = (string) $this->userPackagesRepository->getTotalCreditsByUser($user);
  535.         // My Account Managers
  536.         $account['account_managers'] = !empty($user->getCompany()) ? $user->getCompany()->getAccountManagers() : null;
  537.         $userTotalRate $this->listingRateService->getSellerTotalRate([
  538.             'userId' => $user->getId(),
  539.             'timespan' => ListingRateConstant::DATE_RANGE_START,
  540.         ]);
  541.         $account['userTotalRate'] = $userTotalRate['rate'] ?? null;
  542.         return $account;
  543.     }
  544.     /**
  545.      * Get User Account.
  546.      *
  547.      * @Operation(
  548.      *     tags={"User"},
  549.      *     summary="Get User Account.",
  550.      *
  551.      * )
  552.      *
  553.      * @Rest\Get("/api/v2/user/{user}/account", options={"i18n" = false}, name="aqarmap_api_get_user_account")
  554.      *
  555.      * @Rest\View(serializerGroups={"Default", "SuiteCrm"})
  556.      *
  557.      * @return array
  558.      */
  559.     public function getUserAccount(User $user)
  560.     {
  561.         ini_set('memory_limit''512M');
  562.         return $this->respond($user);
  563.     }
  564.     /**
  565.      * Get User Apps Last Checked Date.
  566.      *
  567.      * @Operation(
  568.      *     tags={"User"},
  569.      *     summary="Get User Apps Last Checked Date.",
  570.      *
  571.      *     @OA\Parameter(
  572.      *         name="source",
  573.      *         in="query",
  574.      *         description="Add Source for any kind of application (1 maps to live) is the available options",
  575.      *         required=false,
  576.      *     ),
  577.      *
  578.      * )
  579.      *
  580.      * @Rest\Get("/api/v2/user/checkins", options={"i18n" = false}, name="aqarmap_api_checkins")
  581.      *
  582.      * @Rest\QueryParam(name="source", default=1, description="Add Source for any kind of application (1 maps to live) is the available options")
  583.      *
  584.      * @Rest\View(serializerGroups={"Default", "SuiteCrm"})
  585.      *
  586.      * @Security("is_granted('ROLE_USER')")
  587.      *
  588.      * @return array
  589.      */
  590.     public function checkin(Request $request)
  591.     {
  592.         /** @var User $user */
  593.         $user $this->getUser();
  594.         $source $request->query->get('source');
  595.         if (UserCheckinSource::LIVE_LABEL == strtolower($source)) {
  596.             $source UserCheckinSource::LIVE;
  597.         }
  598.         if (!\in_array($sourceUserCheckinSource::getSources())) {
  599.             return $this->respond('Not Implemented source'Response::HTTP_NOT_IMPLEMENTED);
  600.         }
  601.         $this->userManager->checkinUser($user$source);
  602.         $this->userCheckinHistoryServiceInterface->create($user->getId(), $source);
  603.         return $this->respond([], Response::HTTP_NO_CONTENT);
  604.     }
  605.     /**
  606.      * Get My Leads.
  607.      *
  608.      * @Operation(
  609.      *     tags={"User"},
  610.      *     summary="Get My Leads.",
  611.      *
  612.      *     @OA\Parameter(
  613.      *         name="page",
  614.      *         in="query",
  615.      *         description="Page number, starting from 1.",
  616.      *         required=false,
  617.      *     ),
  618.      *     @OA\Parameter(
  619.      *         name="limit",
  620.      *         in="query",
  621.      *         description="Number of items per page.",
  622.      *         required=false,
  623.      *     ),
  624.      *     @OA\Parameter(
  625.      *         name="user_id",
  626.      *         in="query",
  627.      *         description="Filter Leads with the given user id",
  628.      *         required=false,
  629.      *     ),
  630.      *     @OA\Parameter(
  631.      *         name="quality",
  632.      *         in="query",
  633.      *         description="Filter Leads with the given quality",
  634.      *         required=false,
  635.      *     ),
  636.      *
  637.      * )
  638.      *
  639.      * @Rest\Get("/api/v2/user/leads", options={"i18n" = false}, name="aqarmap_api_get_my_leads")
  640.      *
  641.      * @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
  642.      * @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
  643.      * @Rest\QueryParam(name="user_id", requirements="\d+", nullable=true, description="Filter Leads with the given user id")
  644.      * @Rest\QueryParam(name="quality", requirements="\d+", nullable=true, description="Filter Leads with the given quality")
  645.      *
  646.      * @Rest\View(serializerGroups={"Default", "MyLeads", "LeadQuality"})
  647.      *
  648.      * @Security("is_granted('ROLE_BROKER')")
  649.      *
  650.      * @return array
  651.      */
  652.     public function getMyLeads(Request $requestEntityManagerInterface $entityManagerSubAccountService $subAccountService)
  653.     {
  654.         $leadRepo $entityManager->getRepository(ListingLead::class);
  655.         $entityManager->getFilters()->disable('softdeleteable');
  656.         $criteria = [
  657.             'user_id' => $request->query->get('user_id'),
  658.             'quality' => $request->query->get('quality'),
  659.         ];
  660.         $users $subAccountService->getActiveSubAccountsIds($request->get('users', []), $this->getUser()->getId());
  661.         $pagination $this->paginator->paginate(
  662.             $leadRepo->getUserLeads($users$criterianullnulltrue),
  663.             $request->query->get('page'1),
  664.             $request->query->get('limit'10)
  665.         );
  666.         $types = [];
  667.         foreach (LeadTypes::getChoices() as $key => $type) {
  668.             $types[] = [
  669.                 $key => $this->translator->trans($type),
  670.             ];
  671.         }
  672.         return [
  673.             'leads' => $pagination,
  674.             'types' => $types,
  675.         ];
  676.     }
  677.     /**
  678.      * Get My Customers.
  679.      *
  680.      * @Operation(
  681.      *     tags={"User"},
  682.      *     summary="Get My Customers.",
  683.      *
  684.      *     @OA\Parameter(
  685.      *         name="page",
  686.      *         in="query",
  687.      *         description="Page number, starting from 1.",
  688.      *         required=false,
  689.      *     ),
  690.      *     @OA\Parameter(
  691.      *         name="limit",
  692.      *         in="query",
  693.      *         description="Number of items per page.",
  694.      *         required=false,
  695.      *     ),
  696.      *
  697.      * )
  698.      *
  699.      * @Rest\Get("/api/v2/user/customers", options={"i18n" = false}, name="aqarmap_api_get_my_customers")
  700.      *
  701.      * @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
  702.      * @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=10, description="Number of items per page.")
  703.      *
  704.      * @Rest\View(serializerGroups={"Default","List"})
  705.      *
  706.      * @Security("is_granted('ROLE_BROKER')")
  707.      *
  708.      * @return array
  709.      */
  710.     public function getMyCustomers(Request $request)
  711.     {
  712.         /** @var User $user */
  713.         $user $this->getUser();
  714.         $leadRepo $this->entityManager->getRepository(User::class);
  715.         $pagination $this->paginator->paginate(
  716.             $leadRepo->getUserCustomers($user),
  717.             $request->query->get('page'1),
  718.             $request->query->get('limit'10),
  719.             ['wrap-queries' => true]
  720.         );
  721.         return [
  722.             'customers' => $pagination,
  723.         ];
  724.     }
  725.     /**
  726.      * Get User Note.
  727.      *
  728.      * @Operation(
  729.      *     tags={"User"},
  730.      *     summary="Returns a Note for a specific user",
  731.      *
  732.      *     @OA\Response(
  733.      *         response="404",
  734.      *         description="Returned when the user is not found"
  735.      *     )
  736.      * )
  737.      *
  738.      * @Rest\Get("/api/v2/user/{id}/note", options={"i18n" = false}, name="aqarmap_api_get_user_note")
  739.      *
  740.      * @Rest\View()
  741.      *
  742.      * @Security("is_granted('ROLE_USER')")
  743.      */
  744.     public function getListingNote(User $user): View
  745.     {
  746.         $userNoteRepo $this->entityManager->getRepository(UserNote::class);
  747.         return $this->respond($userNoteRepo->findOneBy([
  748.             'notedBy' => $this->getUser(),
  749.             'user' => $user,
  750.         ]));
  751.     }
  752.     /**
  753.      * Create User Note.
  754.      *
  755.      * @Operation(
  756.      *     tags={"User"},
  757.      *     summary="Creates a Note for a specific User (Overrides previous note)",
  758.      *
  759.      *     @OA\Parameter(
  760.      *         name="body",
  761.      *          in="query",
  762.      *         description="Note Body",
  763.      *         required=false,
  764.      *     ),
  765.      *     @OA\Parameter(
  766.      *         name="source",
  767.      *          in="query",
  768.      *         description="Supported sources: 1 = Website, 2 = Consumer App, 3 = Live App",
  769.      *         required=false,
  770.      *     ),
  771.      *     @OA\Parameter(
  772.      *         name="last_modified_at",
  773.      *          in="query",
  774.      *         description="dateTime",
  775.      *         required=false,
  776.      *     ),
  777.      *     @OA\Parameter(
  778.      *         name="created_at",
  779.      *          in="query",
  780.      *         description="dateTime",
  781.      *         required=false,
  782.      *     ),
  783.      *
  784.      *     @OA\Response(
  785.      *         response="201",
  786.      *         description="Returned when successfully Created"
  787.      *     ),
  788.      *     @OA\Response(
  789.      *         response="404",
  790.      *         description="Returned when the listing is not found"
  791.      *     )
  792.      * )
  793.      *
  794.      * @Rest\Post("/api/v2/user/{id}/note", options={"i18n" = false}, name="aqarmap_api_post_user_note")
  795.      *
  796.      * @Rest\RequestParam(name="body", description="Note Body")
  797.      * @Rest\RequestParam(name="source", description="Supported sources: 1 = Website, 2 = Consumer App, 3 = Live App")
  798.      * @Rest\RequestParam(name="last_modified_at", description="dateTime")
  799.      * @Rest\RequestParam(name="created_at", description="dateTime")
  800.      *
  801.      * @Security("is_granted('ROLE_USER')")
  802.      *
  803.      * @return array
  804.      */
  805.     public function postUserNote(User $userRequest $request)
  806.     {
  807.         $em $this->entityManager;
  808.         $userNoteRepo $em->getRepository(UserNote::class);
  809.         // Trying to find old note
  810.         $userNote $userNoteRepo->findOneBy([
  811.             'notedBy' => $this->getUser(),
  812.             'user' => $user,
  813.         ]);
  814.         if (empty($userNote)) {
  815.             $userNote = new UserNote();
  816.         }
  817.         $userNote->setBody($request->request->get('body'));
  818.         $userNote->setNotedBy($this->getUser());
  819.         $userNote->setUser($user);
  820.         if ($request->request->get('source')) {
  821.             $userNote->setSource($request->request->get('source'));
  822.         }
  823.         if ($request->request->get('last_modified_at')) {
  824.             $userNote->setLastModifiedAt($request->request->get('last_modified_at'));
  825.         }
  826.         if ($request->request->get('created_at')) {
  827.             $userNote->setCreatedAt($request->request->get('created_at'));
  828.         }
  829.         $em->persist($userNote);
  830.         $em->flush();
  831.         return $this->respond($userNoteResponse::HTTP_CREATED);
  832.     }
  833.     /**
  834.      * Check User Role.
  835.      *
  836.      * @Operation(
  837.      *     tags={"User"},
  838.      *     summary="Attempet to update user profile.",
  839.      *
  840.      * )
  841.      *
  842.      * @Rest\Get("/api/v2/user/roles", options={"i18n" = false}, name="aqarmap_api_check_user_roles")
  843.      *
  844.      * @Rest\QueryParam(name="has", description="Provide a user role to be checked [ broker ] for now. ")
  845.      *
  846.      * @Rest\View()
  847.      *
  848.      * @return array
  849.      */
  850.     public function checkUserRoles(Request $request)
  851.     {
  852.         /** @var User $user */
  853.         $user $this->getUser();
  854.         if ('broker' == $request->query->get('has')) {
  855.             if (!\in_array('ROLE_BROKER'$user->getRoles())) {
  856.                 throw new AccessDeniedHttpException("Forbidden, user don't have this permession.");
  857.             }
  858.         } elseif ('dashboard' == $request->query->get('has')) {
  859.             if (!\in_array('ROLE_DASHBOARD'$user->getRoles())) {
  860.                 throw new AccessDeniedHttpException("Forbidden, user don't have this permession.");
  861.             }
  862.         } else {
  863.             throw new BadRequestHttpException('Please provide a valide "has" query parameter.');
  864.         }
  865.         return ['code' => '200'];
  866.     }
  867.     /**
  868.      * Attempet to check email existance.
  869.      *
  870.      * @Operation(
  871.      *     tags={"User"},
  872.      *     summary="Attempet to check email existance.",
  873.      *
  874.      *     @OA\Parameter(
  875.      *         name="_username",
  876.      *          in="query",
  877.      *         description="Username or Email..",
  878.      *         required=false,
  879.      *     ),
  880.      *
  881.      * )
  882.      *
  883.      * @Rest\Post("/api/user/attempt", options={"i18n" = false}, name="aqarmap_user_email_checker", options={"expose"=true})
  884.      * @Rest\Post("/api/v2/user/check", options={"i18n" = false}, name="aqarmap_v2_user_email_checker")
  885.      *
  886.      * @Rest\RequestParam(name="_username", description="Username or Email..")
  887.      *
  888.      * @return View
  889.      */
  890.     public function attempt(Request $request)
  891.     {
  892.         $email $request->request->get('_username');
  893.         $data = ['exists' => false];
  894.         /** @var User $user */
  895.         $user $this->fosUserManager->findUserByUsernameOrEmail($email);
  896.         $userExistsAndEnabled = ($user && $user->isEnabled());
  897.         if ($userExistsAndEnabled) {
  898.             $data = [
  899.                 'exists' => true,
  900.             ];
  901.             if ('aqarmap_v2_user_email_checker' != $request->get('_route')) {
  902.                 $data['quickRegistered'] = true == $user->isIsQucikRegistered() ? true false;
  903.             }
  904.         }
  905.         return View::create()->setData($data);
  906.     }
  907.     /**
  908.      * Getting the current user data.
  909.      *
  910.      * @Rest\Get("/api/user", options={"i18n" = false}, name="aqarmap_user_data", options={"expose"=true})
  911.      *
  912.      * @Rest\View(serializerGroups={"List"})
  913.      */
  914.     public function getCurrentUser()
  915.     {
  916.         /** @var User $user */
  917.         $user $this->getUser();
  918.         $update false;
  919.         if ($user) {
  920.             $now = new \DateTime();
  921.             $diff $now->diff($user->getLastUpdate());
  922.             if ($diff->days >= 90 || !$user->getCountryCode()) {
  923.                 $update true;
  924.             }
  925.         }
  926.         return $this->respond(['user' => $user'update' => $update]);
  927.     }
  928.     /**
  929.      * Update the current user data.
  930.      *
  931.      * @Rest\Post("/api/user", options={"i18n" = false}, name="aqarmap_user_update", options={"expose"=true})
  932.      *
  933.      * @Rest\View(serializerGroups={"List"})
  934.      *
  935.      * @return View
  936.      */
  937.     public function update(Request $request)
  938.     {
  939.         $userManager $this->fosUserManager;
  940.         /** @var User $user */
  941.         $user $this->getUser();
  942.         $formInputs $request->request->get('register');
  943.         $user->setPhoneNumber($formInputs['phoneNumber']);
  944.         $form $this->createForm(QuickRegistrationFormType::class, $user, [
  945.             'method' => 'POST',
  946.             'action' => $this->generateUrl('aqarmap_user_update'),
  947.             'validation_groups' => ['lead'],
  948.             'onlyLeadData' => true,
  949.         ]);
  950.         $form->handleRequest($request);
  951.         if ($form->isSubmitted() && $form->isValid()) {
  952.             $phoneManager $this->phoneManager;
  953.             $originalPhoneNumber $form->get('phoneNumber')->getData();
  954.             $phone $phoneManager->trimZero($form->get('phoneNumber')->getData(), $form->get('countryCode')->getData());
  955.             $user->setLastUpdate(new \DateTime());
  956.             $phoneManager->addNewUserPhone(
  957.                 $phone,
  958.                 $form->get('countryCode')->getData(),
  959.                 $user,
  960.                 true,
  961.                 true,
  962.                 null,
  963.                 $originalPhoneNumber
  964.             );
  965.             $user->setMigratedPhone(true);
  966.             $user->setPhoneNumber(null);
  967.             $userManager->updateUser($user);
  968.             return $this->respond([
  969.                 'status' => 'ok',
  970.                 'message' => $this->translator->trans('popup_form.profile_updated'),
  971.             ]);
  972.         }
  973.         return $this->respond($formResponse::HTTP_BAD_REQUEST);
  974.     }
  975.     /**
  976.      * Attempet to update user profile.
  977.      *
  978.      * @Operation(
  979.      *     tags={"User"},
  980.      *     summary="get sub-users Accounts.",
  981.      *
  982.      *     @OA\Parameter(
  983.      *         name="page",
  984.      *         in="query",
  985.      *         description="Page number, starting from 1.",
  986.      *         required=false,
  987.      *     ),
  988.      *     @OA\Parameter(
  989.      *         name="limit",
  990.      *         in="query",
  991.      *         description="Number of items per page.",
  992.      *         required=false,
  993.      *     ),
  994.      *
  995.      * )
  996.      *
  997.      * @Rest\Put("/api/v2/user", options={"i18n" = false}, name="aqarmap_user_profile_update")
  998.      *
  999.      * @Security("is_granted('ROLE_USER')")
  1000.      *
  1001.      * @Rest\View(serializerGroups = {"Default", "Details"})
  1002.      */
  1003.     public function updateUserProfile(Request $request)
  1004.     {
  1005.         $userManager $this->fosUserManager;
  1006.         /** @var User $user */
  1007.         $user $this->getUser();
  1008.         $formInputs $request->request->get('updateProfile');
  1009.         $user->setPhoneNumber($formInputs['phoneNumber']);
  1010.         $form $this->createForm(UpdateProfileFormType::class, $user, [
  1011.             'method' => 'PUT',
  1012.             'action' => $this->generateUrl('aqarmap_user_profile_update'),
  1013.         ]);
  1014.         $form->handleRequest($request);
  1015.         if ($form->isSubmitted() && $form->isValid()) {
  1016.             $phoneManager $this->phoneManager;
  1017.             $originalPhoneNumber $form->get('phoneNumber')->getData();
  1018.             $phone $phoneManager->trimZero($form->get('phoneNumber')->getData(), $form->get('countryCode')->getData());
  1019.             $user->setLastUpdate(new \DateTime());
  1020.             $phoneManager->addNewUserPhone(
  1021.                 $phone,
  1022.                 $form->get('countryCode')->getData(),
  1023.                 $user,
  1024.                 true,
  1025.                 true,
  1026.                 null,
  1027.                 $originalPhoneNumber
  1028.             );
  1029.             $user->setMigratedPhone(true);
  1030.             $user->setPhoneNumber(null);
  1031.             $userManager->updateUser($user);
  1032.             return $this->respond([
  1033.                 'status' => 'ok',
  1034.                 'message' => $this->translator->trans('popup_form.profile_updated'),
  1035.             ]);
  1036.         }
  1037.         return $this->respond($formResponse::HTTP_BAD_REQUEST);
  1038.     }
  1039.     /**
  1040.      * update user profile basic info.
  1041.      *
  1042.      * @Rest\Post("/api/v2/user/update-profile-basic-info", options={"i18n" = false}, name="aqarmap_user_profile_update-basic-info")
  1043.      *
  1044.      * @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
  1045.      *
  1046.      * @OA\Tag(name="User")
  1047.      *
  1048.      * @OA\RequestBody(
  1049.      *  description="Request content",
  1050.      *
  1051.      *  @Model(type=UpdateProfileBasicInfoFormType::class)
  1052.      * )
  1053.      */
  1054.     public function updateProfileBasicInfo(Request $requestMessageBusInterface $bus): View
  1055.     {
  1056.         /** @var User $user */
  1057.         $user $this->getUser();
  1058.         $form $this->createForm(UpdateProfileBasicInfoFormType::class, $user, [
  1059.             'csrf_protection' => false,
  1060.         ]);
  1061.         $form->handleRequest($request);
  1062.         if ($form->isSubmitted() && $form->isValid()) {
  1063.             $user->setIsValidPersonalPhoto(false);
  1064.             $this->fosUserManager->updateUser($user);
  1065.             $bus->dispatch(new UpdateProfileMessage($user->getAuthIdentifier(), (string) $user->getFullName()));
  1066.             return $this->respond([
  1067.                 'user' => $user,
  1068.             ]);
  1069.         }
  1070.         return $this->respond($formResponse::HTTP_BAD_REQUEST);
  1071.     }
  1072.     /**
  1073.      * update user phones.
  1074.      *
  1075.      * @Rest\Post("/api/v2/user/update-user-phone/{id}", options={"i18n" = false}, name="aqarmap_user_update_phone")
  1076.      *
  1077.      * @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
  1078.      */
  1079.     public function updateUserPhone(Request $requestUserPhone $userPhone): View
  1080.     {
  1081.         $form $this->createForm(UserPhoneType::class, $userPhone);
  1082.         $form->handleRequest($request);
  1083.         if ($form->isSubmitted() && $form->isValid()) {
  1084.             $this->userPhoneManager->saveUserPhone($userPhone);
  1085.             if ($userPhone->isWhatsApp()) {
  1086.                 $this->userPhoneManager->disablePhonesWhatsApp($userPhone);
  1087.             }
  1088.             return $this->respond([
  1089.                 'phone' => $userPhone,
  1090.             ], Response::HTTP_OK);
  1091.         }
  1092.         return $this->respond($formResponse::HTTP_BAD_REQUEST);
  1093.     }
  1094.     /**
  1095.      * remove user phones.
  1096.      *
  1097.      * @Rest\Delete("/api/v2/user/remove-user-phone/{id}", options={"i18n" = false}, name="aqarmap_user_remove_phone")
  1098.      *
  1099.      * @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
  1100.      */
  1101.     public function removeUserPhone(UserPhone $userPhone): View
  1102.     {
  1103.         $this->userPhoneManager->removeUserPhone($userPhone);
  1104.         return $this->respond([
  1105.             'message' => 'Phone removed successfully',
  1106.         ], Response::HTTP_OK);
  1107.     }
  1108.     /**
  1109.      * update user company info.
  1110.      *
  1111.      * @Rest\Post("/api/v2/user/update-company-info", options={"i18n" = false}, name="aqarmap_user_update-company-info")
  1112.      *
  1113.      * @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
  1114.      */
  1115.     public function updateCompanyInfo(Request $request): View
  1116.     {
  1117.         /** @var User $user */
  1118.         $user $this->getUser();
  1119.         $form $this->createForm(UpdateCompanyInfoFormType::class, $user, [
  1120.             'csrf_protection' => false,
  1121.         ]);
  1122.         $form->handleRequest($request);
  1123.         if ($form->isSubmitted() && $form->isValid()) {
  1124.             $this->fosUserManager->updateUser($user);
  1125.             return $this->respond([
  1126.                 'user' => $user,
  1127.             ], Response::HTTP_OK);
  1128.         }
  1129.         return $this->respond($formResponse::HTTP_BAD_REQUEST);
  1130.     }
  1131.     /**
  1132.      * update user company info.
  1133.      *
  1134.      * @Rest\Post("/api/v2/user/remove-photo", options={"i18n" = false}, name="aqarmap_user_remove-photo")
  1135.      *
  1136.      * @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
  1137.      */
  1138.     public function removePhoto(Request $request): View
  1139.     {
  1140.         /** @var User $user */
  1141.         $user $this->getUser();
  1142.         $this->userManager->removePhoto($request->request->get('type'), $user);
  1143.         return $this->respond([
  1144.             'user' => $user,
  1145.         ], Response::HTTP_OK);
  1146.     }
  1147.     /**
  1148.      * update user profile personal info.
  1149.      *
  1150.      * @Rest\Post("/api/v2/user/update-profile-personal-info", options={"i18n" = false}, name="aqarmap_user_profile_update-personal-info")
  1151.      *
  1152.      * @Rest\View(serializerGroups = {"Default", "Details", "UpdateProfile"})
  1153.      */
  1154.     public function updateProfilePersonalInfo(Request $request): View
  1155.     {
  1156.         /** @var User $user */
  1157.         $user $this->getUser();
  1158.         $personalInfo $user->getActivePersonalInfo();
  1159.         if (null === $personalInfo) {
  1160.             $personalInfo = new PersonalInfo();
  1161.             $personalInfo->setUser($user);
  1162.         }
  1163.         $form $this->createForm(PersonalInfoType::class, $personalInfo, [
  1164.             'csrf_protection' => false,
  1165.         ]);
  1166.         $form->handleRequest($request);
  1167.         if ($form->isSubmitted() && $form->isValid()) {
  1168.             $this->userManager->updateProfilePersonalInfo($user$personalInfo);
  1169.             return $this->respond([
  1170.                 'user' => $user,
  1171.             ], Response::HTTP_OK);
  1172.         }
  1173.         return $this->respond($formResponse::HTTP_BAD_REQUEST);
  1174.     }
  1175.     /**
  1176.      * get user profile personal info options data.
  1177.      *
  1178.      * @Rest\Get("/api/v2/user/get-profile-personal-info-options-data", options={"i18n" = false}, name="aqarmap_user_get_profile_personal_info_options_data")
  1179.      */
  1180.     public function getPersonalInfoOptionsData(): View
  1181.     {
  1182.         return $this->respond([
  1183.             'age' => array_flip(Age::$AGES),
  1184.             'gender' => array_flip(Gender::$GENDER),
  1185.             'maritalStatus' => array_flip(MaritalStatus::$MaritalStatus),
  1186.             'education' => array_flip(Education::$EDUCATION),
  1187.             'industry' => array_flip(Industry::$INDUSTRY),
  1188.             'position' => array_flip(Position::$POSITION),
  1189.             'purchaseInfo' => array_flip(PurchaseInfo::$PURCHASE_INFO),
  1190.         ]);
  1191.     }
  1192.     /**
  1193.      * Sending password reset link.
  1194.      *
  1195.      * @Operation(
  1196.      *     tags={"User"},
  1197.      *     summary="Sending password reset link.",
  1198.      *
  1199.      *     @OA\Parameter(
  1200.      *         name="username",
  1201.      *         in="query",
  1202.      *         description="Username or Email..",
  1203.      *         required=false,
  1204.      *     ),
  1205.      *
  1206.      * )
  1207.      *
  1208.      * @Rest\Post("/api/user/reset", options={"i18n" = false}, name="aqarmap_user_reset_email")
  1209.      *
  1210.      * @Rest\QueryParam(name="username", description="Username or Email..")
  1211.      *
  1212.      * @return View|Response
  1213.      */
  1214.     public function sendResetPasswordEmail(Request $requestAuthServer $authServer)
  1215.     {
  1216.         $username $request->request->get('username');
  1217.         $translator $this->translator;
  1218.         /** @var $user User */
  1219.         $user $this->fosUserManager->findUserByUsernameOrEmail($username);
  1220.         if (null === $user) {
  1221.             throw $this->createNotFoundException('Unable to find this user.');
  1222.         }
  1223.         $authServer->resetPassword($user->getEmailCanonical());
  1224.         return View::create()->setData(['status' => 'ok''message' => $translator->trans('resetting.check_email', ['%email%' => $user->getEmail()], 'FOSUserBundle')]);
  1225.     }
  1226.     /**
  1227.      * Count user listings.
  1228.      *
  1229.      * @Operation(
  1230.      *     tags={"User"},
  1231.      *     summary="Count user listings.",
  1232.      *
  1233.      * )
  1234.      *
  1235.      * @Rest\Post("/api/user/listings/count", options={"i18n" = false, "expose"=true}, name="aqarmap_user_listings_counter")
  1236.      *
  1237.      * @return View
  1238.      */
  1239.     public function countUserListings()
  1240.     {
  1241.         /** @var User $user */
  1242.         $user $this->getUser();
  1243.         $email $user->getEmail();
  1244.         $data = [];
  1245.         /** @var User $user */
  1246.         $user $this->fosUserManager->findUserByUsernameOrEmail($email);
  1247.         if ($user) {
  1248.             $data = [
  1249.                 'drafts' => $user->getDraftListings()->count(),
  1250.                 'all' => $user->getNotDraftListings()->count(),
  1251.             ];
  1252.         }
  1253.         return $this->respond($data);
  1254.     }
  1255.     /**
  1256.      * Get users based on keyword.
  1257.      *
  1258.      * @Operation(
  1259.      *     tags={"User"},
  1260.      *     summary="Get users based on keyword.",
  1261.      *
  1262.      * )
  1263.      *
  1264.      * @Rest\Get("/api/user", options={"i18n"=false, "expose"=true}, name="api_aqarmap_keyword_users")
  1265.      *
  1266.      * @return View
  1267.      */
  1268.     public function getUserByKeyword(Request $request)
  1269.     {
  1270.         /** @var QueryBuilder $query */
  1271.         $query $this->entityManager->getRepository(User::class)->search([
  1272.             'q' => $request->query->get('keyword'),
  1273.             'search' => $request->query->get('searchBy'),
  1274.             'limit' => 5,
  1275.         ]);
  1276.         $users $query->getQuery()->getResult();
  1277.         if (== \count($users)) {
  1278.             throw $this->createNotFoundException('Unable to find this user.');
  1279.         }
  1280.         $data = [];
  1281.         foreach ($users as $user) {
  1282.             $data[] = [
  1283.                 'userId' => $user->getId(),
  1284.                 'username' => $user->getfullName(),
  1285.                 'userEmail' => $user->getEmail(),
  1286.                 'phoneNumber' => $user->getPhoneNumber(),
  1287.             ];
  1288.         }
  1289.         return $this->respond($data);
  1290.     }
  1291.     /**
  1292.      * List Team associates.
  1293.      *
  1294.      * @Operation(
  1295.      *     tags={"User"},
  1296.      *     summary="List Team associates.",
  1297.      *
  1298.      * )
  1299.      *
  1300.      * @Rest\Get("/api/user/team/associates", options={"i18n" = false, "expose"=true}, name="api_aqarmap_team_users")
  1301.      *
  1302.      * @return View
  1303.      */
  1304.     public function getTeamUsers(Request $request)
  1305.     {
  1306.         $team $this->entityManager
  1307.             ->getRepository(\Aqarmap\Bundle\UserBundle\Entity\Team::class)
  1308.             ->find((int) $request->query->get('teamId'));
  1309.         $data = [];
  1310.         foreach ($team->getUsers() as $user) {
  1311.             $data[] = [
  1312.                 'id' => $user->getId(),
  1313.                 'username' => $user->getUsername(),
  1314.             ];
  1315.         }
  1316.         return $this->respond($data);
  1317.     }
  1318.     /**
  1319.      * get sub-users Accounts.
  1320.      *
  1321.      * @Operation(
  1322.      *     tags={"Oauth2"},
  1323.      *     summary="",
  1324.      *
  1325.      *     @OA\Parameter(
  1326.      *         name="client_id",
  1327.      *         in="query",
  1328.      *         description="Client ID",
  1329.      *         required=false,
  1330.      *     ),
  1331.      *     @OA\Parameter(
  1332.      *         name="client_secret",
  1333.      *         in="query",
  1334.      *         description="Client Secret",
  1335.      *         required=false,
  1336.      *     ),
  1337.      *     @OA\Parameter(
  1338.      *         name="subAccount_id",
  1339.      *         in="query",
  1340.      *         description="User Sub-account Id",
  1341.      *         required=false,
  1342.      *
  1343.      *         @OA\Schema(type="")
  1344.      *     ),
  1345.      *
  1346.      * )
  1347.      *
  1348.      *   statusCodes={
  1349.      *       200 = "Returned when successful",
  1350.      *       404="Returned when the parent account is not found"
  1351.      *   }
  1352.      * )
  1353.      *
  1354.      * @Rest\Get("/api/v2/sub-accounts", options={"i18n" = false}, name="aqarmap_api_get_sub-accounts_v2")
  1355.      * @Rest\Get("/api/v2/sub-acccounts", options={"i18n" = false}, name="aqarmap_api_get_sub-acccounts_v2")
  1356.      *
  1357.      * @Rest\QueryParam(name="page", requirements="\d+", nullable=true, default=1, description="Page number, starting from 1.")
  1358.      * @Rest\QueryParam(name="limit", requirements="\d+", nullable=true, default=20, description="Number of items per page.")
  1359.      *
  1360.      * @Rest\View(serializerGroups={"Default", "Details"})
  1361.      *
  1362.      * @return array
  1363.      */
  1364.     public function getSubAccounts(Request $request)
  1365.     {
  1366.         ini_set('memory_limit''512M');
  1367.         /** @var User $user */
  1368.         $user $this->getUser();
  1369.         $subAccounts $this->entityManager
  1370.             ->getRepository(User::class)
  1371.             ->findBy(['parent' => $user->getId()]);
  1372.         $creditManager $this->creditManager;
  1373.         $listingManager $this->listingManager;
  1374.         if (\count($subAccounts)) {
  1375.             $startDate null;
  1376.             $period null;
  1377.             $subAccountsData = [];
  1378.             /** @var User $subAccount */
  1379.             foreach ($subAccounts as $subAccount) {
  1380.                 @array_push($subAccountsData, [
  1381.                     'id' => $subAccount->getId(),
  1382.                     'referenceId' => $subAccount->getId(),
  1383.                     'username' => $subAccount->getUsername(),
  1384.                     'logo' => $subAccount->getLogo(),
  1385.                     'listingsCount' => $subAccount->getListings()->count(),
  1386.                     'hasValidCredit' => $subAccount->hasValidCredit(),
  1387.                     'credit' => $creditManager->getBalance($subAccount),
  1388.                     'rates' => $listingManager->getUserListingsRatesCounts((object) $subAccount$startDate$periodfalse),
  1389.                 ]);
  1390.             }
  1391.             return [
  1392.                 'sub-accounts' => $this->paginator->paginate(
  1393.                     $subAccountsData,
  1394.                     $request->query->get('page'self::FIRST_PAGE_NUMBER),
  1395.                     $request->query->get('limit'self::SUB_ACCOUNTS_LIMIT)
  1396.                 ),
  1397.             ];
  1398.         }
  1399.         return $this->respond([], Response::HTTP_NOT_FOUND);
  1400.     }
  1401.     /**
  1402.      * @Operation(
  1403.      *     tags={"User"},
  1404.      *     summary="",
  1405.      *
  1406.      * )
  1407.      *
  1408.      * @Rest\Get("api/v2/oauth/switchAccounts", options={"i18n" = false}, name="aqarmap_api_oauth_switchAccounts")
  1409.      *
  1410.      * @Rest\QueryParam(name="client_id", description="Client ID",)
  1411.      * @Rest\QueryParam(name="client_secret", description="Client Secret")
  1412.      *
  1413.      * @Rest\RequestParam(name="subAccount_id", description="User Sub-account Id")
  1414.      *
  1415.      * @Rest\View()
  1416.      *
  1417.      * @return Response
  1418.      */
  1419.     public function switchAccount(Request $request)
  1420.     {
  1421.         $accessToken $request->get('access_token');
  1422.         try {
  1423.             $this->userManager->authenticateWithToken($accessToken);
  1424.         } catch (\Exception $exception) {
  1425.             throw new AccessDeniedHttpException('Forbidden, User is not logged in');
  1426.         }
  1427.         $subAccountId $request->get('subAccount_id');
  1428.         if (!$subAccountId) {
  1429.             throw new BadRequestHttpException('Missing sub-account ID');
  1430.         }
  1431.         if ($request->get('subAccount_id')) {
  1432.             /** @var User $user */
  1433.             $user $this->getUser();
  1434.         }
  1435.         $getParentOfSubAccount $this->userRepository->find($subAccountId)->getParent();
  1436.         if ($getParentOfSubAccount != $user) {
  1437.             throw new AccessDeniedHttpException("Forbidden, sub-account parent doesn't match logged in user");
  1438.         }
  1439.         // @todo remove/replace this after refactoring
  1440.         $subAccountsTokens $this->oAuthTokenService->getToken($request);
  1441.         return $subAccountsTokens;
  1442.     }
  1443.     /**
  1444.      * Get company info of a user.
  1445.      *
  1446.      * @Operation(
  1447.      *     tags={"User"},
  1448.      *     summary="Get company info of a user",
  1449.      *
  1450.      * )
  1451.      *
  1452.      * @Rest\Get("/api/user/{user}/company", options={"i18n" = false, "expose"=true}, name="aqarmap_api_user_company")
  1453.      *
  1454.      * @Security("is_granted('ROLE_ADMIN')")
  1455.      *
  1456.      * @return View
  1457.      */
  1458.     public function getUserCompanyInfo(User $user)
  1459.     {
  1460.         $company $user->getCompany();
  1461.         if (null == $company) {
  1462.             throw $this->createNotFoundException('This user is not linked to any company.');
  1463.         }
  1464.         $companyLocation $company->getLocation();
  1465.         $referal $company->getReferedBy();
  1466.         $accountManagers $company->getAccountManagers();
  1467.         $staff = !$accountManagers->isEmpty() ?
  1468.             $accountManagers->last()
  1469.             : null;
  1470.         $data = [
  1471.             'hqTerritoryId' => $companyLocation $companyLocation->getId() : null,
  1472.             'hqTerritoryText' => $companyLocation $companyLocation->getTitleFullPath() : null,
  1473.             'sellerType' => $company->getSellerType() ? $company->getSellerType() : '',
  1474.             'companyName' => $company->getName() ? $company->getName() : null,
  1475.             'companyEmail' => $company->getEmail() ? $company->getEmail() : null,
  1476.             'referedBy' => $referal $referal->getId() : null,
  1477.             'userEmail' => $referal $referal->getEmail() : null,
  1478.             'userPhone' => $referal $referal->getPhoneNumber() : null,
  1479.             'username' => $referal $referal->getUsername() : null,
  1480.             'accountManagerId' => $staff $staff->getId() : null,
  1481.             'accountManagerEmail' => $staff $staff->getEmail() : null,
  1482.             'accountManagerPhoneNumber' => $staff $staff->getPhone() : null,
  1483.             'accountManagerName' => $staff $staff->getName() : null,
  1484.         ];
  1485.         return $this->respond($data);
  1486.     }
  1487.     /**
  1488.      * Get User total rate.
  1489.      *
  1490.      * @Operation(
  1491.      *     tags={"User"},
  1492.      *     summary="Get User total rate.",
  1493.      *
  1494.      *     @OA\Parameter(
  1495.      *         name="timespan",
  1496.      *         in="query",
  1497.      *         description="Timespan",
  1498.      *         required=false,
  1499.      *     ),
  1500.      *
  1501.      * )
  1502.      *
  1503.      * @Rest\Get("/api/v2/user/{id}/rates", options={"i18n" = false})
  1504.      * @Rest\Get("/api/user/{id}/rates", options={"i18n" = false, "expose"=true}, name="aqarmap_api_get_user_rates")
  1505.      *
  1506.      * @Rest\QueryParam(
  1507.      *     name="timespan",
  1508.      *     nullable=true, description="Timespan"
  1509.      * )
  1510.      *
  1511.      * @Rest\View(serializerGroups={"rate"})
  1512.      *
  1513.      * @return array
  1514.      */
  1515.     public function getRate(Request $requestUser $user)
  1516.     {
  1517.         $criteria = [
  1518.             'userId' => $user->getId(),
  1519.             'timespan' => $request->query->get('timespan'ListingRateConstant::DATE_RANGE_START),
  1520.         ];
  1521.         return $this->listingRateService->getWeeklySellerRateDetails($criteria);
  1522.     }
  1523.     /**
  1524.      * @Operation(
  1525.      *     tags={"User"},
  1526.      *     summary="",
  1527.      *
  1528.      * )
  1529.      *
  1530.      * @Rest\Post("/api/v2/user/search", options={"i18n" = false})
  1531.      * @Rest\Post("/api/user/search", options={"i18n" = false, "expose"=true}, name="aqarmap_api_post_user_search")
  1532.      *
  1533.      * @Security("is_granted('ROLE_USER')")
  1534.      *
  1535.      * @return array
  1536.      */
  1537.     public function postUserSearch(Request $request)
  1538.     {
  1539.         $this->savedSearchManager->create($request->request->get('search'));
  1540.         return $this->respond('Search Added Successfully');
  1541.     }
  1542.     /**
  1543.      * @Operation(
  1544.      *     tags={"User"},
  1545.      *     summary="",
  1546.      *
  1547.      * )
  1548.      *
  1549.      * @Rest\Delete("/api/v2/user/search/{search}/delete", options={"i18n" = false})
  1550.      * @Rest\Delete("/api/user/search/{search}/delete", options={"i18n" = false, "expose"=true}, name="aqarmap_api_delete_user_search")
  1551.      *
  1552.      * @Security("is_granted('ROLE_OWNER', search)")
  1553.      *
  1554.      * @return array
  1555.      */
  1556.     public function deleteUserSearch(SavedSearch $search)
  1557.     {
  1558.         $this->savedSearchManager->delete($search);
  1559.         return $this->respond('Search Deleted Successfully');
  1560.     }
  1561.     /**
  1562.      * @Operation(
  1563.      *     tags={"User"},
  1564.      *     summary="",
  1565.      *
  1566.      * )
  1567.      *
  1568.      * @Rest\Get("/api/v2/user/{user}/search/", options={"i18n" = false})
  1569.      * @Rest\Get("/api/user/{user}/search/", options={"i18n" = false, "expose"=true}, name="aqarmap_api_read_user_search")
  1570.      *
  1571.      * @Security("is_granted('ROLE_USER')")
  1572.      *
  1573.      * @Rest\View()
  1574.      */
  1575.     public function searchRead(Request $request): array
  1576.     {
  1577.         $criteria = ['userId' => $request->attributes->get('user')];
  1578.         $savedSearchtRepository $this->container->get('doctrine')->getRepository(SavedSearch::class);
  1579.         $pagination $this->paginator->paginate(
  1580.             $savedSearchtRepository->findSearchQuery($criteria)->getResult(),
  1581.             $request->query->get('page'1),
  1582.             $request->query->get('limit'10)
  1583.         );
  1584.         $mappedItems $this->savedSearchManager->getWithLocations($pagination->getItems(), $request->query->get('hl'));
  1585.         $context SerializationContext::create()->setGroups(['Search']);
  1586.         $pagination->setItems(
  1587.             json_decode($this->container->get('jms_serializer')->serialize($mappedItems'json'$context), true)
  1588.         );
  1589.         return ['search' => $pagination];
  1590.     }
  1591.     /**
  1592.      * @Operation(
  1593.      *     tags={"User"},
  1594.      *     summary="Read favourite",
  1595.      *
  1596.      *     @OA\Parameter(
  1597.      *         name="user_key",
  1598.      *         in="query",
  1599.      *         description="user key",
  1600.      *         required=false,
  1601.      *     ),
  1602.      *
  1603.      * )
  1604.      *
  1605.      * @Rest\Get("/api/v2/user/{user}/favourite", options={"i18n" = false})
  1606.      * @Rest\Get("/api/user/{user}/favourite", options={"i18n" = false, "expose" = true}, name="aqarmap_api_read_listing_favourite")
  1607.      * @Rest\Get("/api/user/favourite", options={"i18n" = false, "expose" = true}, name="aqarmap_api_read_listing_favourite_without_user_id")
  1608.      *
  1609.      * @Rest\QueryParam(name="user_key", description="user key")
  1610.      *
  1611.      * @Rest\View(serializerGroups={"Default", "List"})
  1612.      *
  1613.      * @return array
  1614.      */
  1615.     public function favouriteRead(Request $request)
  1616.     {
  1617.         $pagination $this->paginator->paginate(
  1618.             $this->favouriteService->getUserFavourite($request),
  1619.             $request->query->get('page'1),
  1620.             $request->query->get('limit'10)
  1621.         );
  1622.         return ['favourite' => $this->listingManager->setUserActivitiesFromPagination($pagination)];
  1623.     }
  1624.     /**
  1625.      * @Operation(
  1626.      *     tags={"User"},
  1627.      *     summary="Read favourite",
  1628.      *
  1629.      * )
  1630.      *
  1631.      * @Rest\Get("/api/v2/user/{user}/notes", options={"i18n" = false}, name="aqarmap_api_v2_read_user_note")
  1632.      * @Rest\Get("/api/user/{user}/note", options={"i18n" = false, "expose" = true}, name="aqarmap_api_read_user_note")
  1633.      *
  1634.      * @Rest\View(serializerGroups={"Default", "List"})
  1635.      *
  1636.      * @return array
  1637.      */
  1638.     public function noteRead(Request $request)
  1639.     {
  1640.         $criteria = ['userId' => $request->attributes->get('user')];
  1641.         $listingNoteRepository $this->entityManager->getRepository(\Aqarmap\Bundle\ListingBundle\Entity\ListingNote::class);
  1642.         $pagination $this->paginator->paginate(
  1643.             $listingNoteRepository->findQuery($criteria),
  1644.             $request->query->get('page'1),
  1645.             $request->query->get('limit'10)
  1646.         );
  1647.         return ['note' => $this->listingManager->setUserActivitiesFromPagination($pagination)];
  1648.     }
  1649.     /**
  1650.      * @Operation(
  1651.      *     tags={"User"},
  1652.      *     summary="Show Phone Number",
  1653.      *
  1654.      * )
  1655.      *
  1656.      * @Rest\Get("/api/user/{user}/phone", options={"i18n" = false, "expose" = true}, name="aqarmap_api_show_user_phone")
  1657.      *
  1658.      * @Rest\View()
  1659.      *
  1660.      * @return array
  1661.      */
  1662.     public function showPhoneNumber(Request $request)
  1663.     {
  1664.         $criteria = ['userId' => $request->attributes->get('user')];
  1665.         /** @var User $user */
  1666.         $user $this
  1667.             ->entityManager
  1668.             ->getRepository(User::class)
  1669.             ->findOneById($criteria['userId']);
  1670.         if (!$user) {
  1671.             return $this->respond('User Not Found'Response::HTTP_NOT_FOUND);
  1672.         }
  1673.         $phone sprintf('%s%s'$user->getCountryCode(), $this->userPhoneManager->extractPhoneWithoutCountryCode($user));
  1674.         return $this->respond(['phone' => $phone], Response::HTTP_OK);
  1675.     }
  1676.     /**
  1677.      * Get leads that user generates.
  1678.      *
  1679.      * @Operation(
  1680.      *     tags={"User"},
  1681.      *     summary="Get leads that user generates.",
  1682.      *
  1683.      *     @OA\Parameter(
  1684.      *         name="sort",
  1685.      *         in="query",
  1686.      *         description="Sort leads by creation date",
  1687.      *         required=false,
  1688.      *     ),
  1689.      *     @OA\Parameter(
  1690.      *         name="direction",
  1691.      *         in="query",
  1692.      *         description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)",
  1693.      *         required=false,
  1694.      *     ),
  1695.      *
  1696.      * )
  1697.      *
  1698.      * @Rest\Get("/api/v2/user/my-lead", options={"i18n" = false})
  1699.      * @Rest\Get("/api/user/my-lead", options={"i18n" = false, "expose"=true}, name="aqarmap_api_read_user_generated_leads")
  1700.      *
  1701.      * @Rest\QueryParam(
  1702.      *     name="sort", requirements="createdAt", nullable=true,
  1703.      *     default=null, description="Sort leads by creation date"
  1704.      * )
  1705.      * @Rest\QueryParam(
  1706.      *     name="direction", requirements="asc|desc", nullable=true,
  1707.      *     default="asc", description="Ascending (A to Z, 0 to 9), Descending (Z to A, 9 to 0)"
  1708.      * )
  1709.      *
  1710.      * @Security("is_granted('ROLE_USER')")
  1711.      *
  1712.      * @Rest\View(serializerGroups={"Default", "List"})
  1713.      *
  1714.      * @return array
  1715.      */
  1716.     public function myGeneratedLeads(Request $request)
  1717.     {
  1718.         $pagination $this->paginator->paginate(
  1719.             $this->leadService->getGeneratedLeads(),
  1720.             $request->query->get('page'1),
  1721.             $request->query->get('limit'10)
  1722.         );
  1723.         return ['lead' => $this->listingManager->setUserActivitiesFromPagination($pagination)];
  1724.     }
  1725.     /**
  1726.      * update listing fields.
  1727.      *
  1728.      * @Rest\Post("api/user/phone/{id}/edit", options={"i18n" = false, "expose" = true}, name="update_user_phone_field")
  1729.      *
  1730.      * @Rest\View(serializerGroups={"Default", "Details"})
  1731.      *
  1732.      * @Security("is_granted('ROLE_ADMIN')")
  1733.      *
  1734.      * @return Response
  1735.      */
  1736.     public function updatePhone(Phone $phoneRequest $request)
  1737.     {
  1738.         $this->phoneManager->updateNumber($phone$request->request->get('number'));
  1739.         return $this->respond([
  1740.             'phone' => $phone,
  1741.             'msg' => 'Phone was updated successfully',
  1742.         ]);
  1743.     }
  1744.     /**
  1745.      * Get Account NPS Data.
  1746.      *
  1747.      * @Operation(
  1748.      *     tags={"User"},
  1749.      *     summary="Get Account NPS Data.",
  1750.      *
  1751.      * )
  1752.      *
  1753.      * @Rest\Get("/api/stateful/user/nps-data", options={"i18n" = false}, name="aqarmap_api_get_nps_data_stateful")
  1754.      * @Rest\Get("/api/v2/user/nps-data", options={"i18n" = false}, name="aqarmap_api_get_nps_data")
  1755.      *
  1756.      * @Rest\View()
  1757.      *
  1758.      * @Security("is_granted('ROLE_USER')")
  1759.      */
  1760.     public function getNpsData(ListingManager $listingManagerEntityManagerInterface $entityManager): array
  1761.     {
  1762.         /** @var User $user */
  1763.         $user $this->getUser();
  1764.         /** @var ListingRepository $listingRepo */
  1765.         $listingRepo $entityManager->getRepository(Listing::class);
  1766.         $totalLiveListings $listingRepo->countLiveListingsByUser($user)->getQuery()->enableResultCache()->getSingleScalarResult();
  1767.         /** @var UserPackagesRepository $userPackageRepository */
  1768.         $userPackageRepository $entityManager->getRepository(UserPackages::class);
  1769.         $hasActivePackage = (bool) $userPackageRepository->hasActivePackageQueryBuilder($user)->getQuery()->enableResultCache()->getOneOrNullResult();
  1770.         // Define the user type (userType is not enough to determine the account type)
  1771.         if (!$hasActivePackage && == $totalLiveListings) {
  1772.             $accountType 'CONSUMER';
  1773.         } elseif ($totalLiveListings 10) {
  1774.             $accountType 'CUSTOMER';
  1775.         } else {
  1776.             $accountType 'PRIVATE_OWNER';
  1777.         }
  1778.         return [
  1779.             'userEmail' => $user->getEmailCanonical(),
  1780.             'accountType' => $accountType,
  1781.             'createdAt' => $user->getCreatedAt(),
  1782.         ];
  1783.     }
  1784.     /**
  1785.      * Disable softdeleteable.
  1786.      */
  1787.     private function disableSoftDelete(): void
  1788.     {
  1789.         if ($this->entityManager->getFilters()->isEnabled('softdeleteable')) {
  1790.             $this->entityManager->getFilters()->disable('softdeleteable');
  1791.         }
  1792.     }
  1793.     /**
  1794.      * enable softdeleteable.
  1795.      */
  1796.     private function enableSoftDelete(): void
  1797.     {
  1798.         $this->entityManager->getFilters()->enable('softdeleteable');
  1799.     }
  1800.     /**
  1801.      * Add new UserPhone.
  1802.      *
  1803.      * @Rest\Post("/api/v2/user/phone/add", options={"i18n" = false}, name="aqarmap_phone_add")
  1804.      */
  1805.     public function addUserPhone(Request $requestUserIpInfoServiceInterface $userInfoService): View
  1806.     {
  1807.         /** @var User $user */
  1808.         $user $this->getUser();
  1809.         $form $this->createForm(AddUserPhoneFormType::class, $phone = new Phone(), [
  1810.             'csrf_protection' => false,
  1811.         ]);
  1812.         $form->handleRequest($request);
  1813.         if ($form->isSubmitted() && $form->isValid()) {
  1814.             $phone->setCountry($userInfoService->getUserCountryFromIp($request->getClientIp()));
  1815.             $phoneNumber $this->phoneManager->trimZero($phone->getNumber(), $phone->getCountryCode());
  1816.             $userPhone $this->phoneManager->addNewUserPhone(
  1817.                 $phoneNumber,
  1818.                 $phone->getCountryCode(),
  1819.                 $user,
  1820.                 true,
  1821.                 false,
  1822.                 $phone->getCountry(),
  1823.                 null
  1824.             );
  1825.             return $this->respond([
  1826.                 'userPhone' => $userPhone,
  1827.             ], Response::HTTP_OK);
  1828.         }
  1829.         return $this->respond($formResponse::HTTP_BAD_REQUEST);
  1830.     }
  1831.     /**
  1832.      * Get All UserPhones.
  1833.      *
  1834.      * @Rest\Get("/api/v2/user/phones", options={"i18n" = false}, name="aqarmap_user_phones")
  1835.      */
  1836.     public function getUserPhones(Request $request)
  1837.     {
  1838.         /** @var User $user */
  1839.         $user $this->getUser();
  1840.         return $this->respond($user->getAllPhones(), Response::HTTP_OK);
  1841.     }
  1842. }