src/Aqarmap/Bundle/TopSellerBundle/Service/TopSellerRetrievalService.php line 170

Open in your IDE?
  1. <?php
  2. namespace Aqarmap\Bundle\TopSellerBundle\Service;
  3. use Aqarmap\Bundle\FeatureToggleBundle\Service\FeatureToggleManager;
  4. use Aqarmap\Bundle\ListingBundle\Service\Contracts\V4\LocationServiceInterface;
  5. use Aqarmap\Bundle\ListingBundle\Service\LocationManager;
  6. use Aqarmap\Bundle\TopSellerBundle\Model\TopSeller;
  7. use Aqarmap\Bundle\UserBundle\Entity\User;
  8. use Aqarmap\Bundle\UserBundle\Repository\UserRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Doctrine\ORM\ORMException;
  11. use GuzzleHttp\Client;
  12. use GuzzleHttp\Exception\GuzzleException;
  13. use Psr\Log\LoggerInterface;
  14. use Psr\Log\LogLevel;
  15. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Contracts\HttpClient\HttpClientInterface;
  18. class TopSellerRetrievalService
  19. {
  20.     public const TOP_SELLERS_LIMIT 5;
  21.     /**
  22.      * @var UserRepository
  23.      */
  24.     private $userRepository;
  25.     /**
  26.      * @var Client
  27.      */
  28.     private $httpClient;
  29.     /**
  30.      * @var ParameterBagInterface
  31.      */
  32.     private $parameterBag;
  33.     /**
  34.      * @var LoggerInterface
  35.      */
  36.     private $logger;
  37.     /**
  38.      * @var LocationManager
  39.      */
  40.     private $locationManager;
  41.     /**
  42.      * @var LocationServiceInterface
  43.      */
  44.     private $locationService;
  45.     /**
  46.      * @var FeatureToggleManager
  47.      */
  48.     private $featureToggleManager;
  49.     private HttpClientInterface $searchClient;
  50.     public function __construct(
  51.         EntityManagerInterface $em,
  52.         LoggerInterface $logger,
  53.         LocationManager $locationManager,
  54.         LocationServiceInterface $locationService,
  55.         ParameterBagInterface $parameterBag,
  56.         UserRepository $userRepository,
  57.         FeatureToggleManager $featureToggleManager,
  58.         HttpClientInterface $searchClient
  59.     ) {
  60.         $this->userRepository $userRepository;
  61.         $this->httpClient = new Client();
  62.         $this->logger $logger;
  63.         $this->locationManager $locationManager;
  64.         $this->parameterBag $parameterBag;
  65.         $this->locationService $locationService;
  66.         $this->featureToggleManager $featureToggleManager;
  67.         $this->searchClient $searchClient;
  68.     }
  69.     /**
  70.      * @return array
  71.      */
  72.     public function retrieveTopSellers(TopSeller $topSellerstring $locale 'ar')
  73.     {
  74.         $response $this->getTopSellersResponseFromService($topSeller);
  75.         $data $response $response->getBody() : '';
  76.         $topSellers = (array) json_decode($datatrue);
  77.         return $this->getTopSellersData($topSellers$locale);
  78.     }
  79.     /**
  80.      * @param TopSeller $topSeller
  81.      */
  82.     private function getTopSellersResponseFromService($topSeller): ?\Psr\Http\Message\ResponseInterface
  83.     {
  84.         try {
  85.             if ($this->featureToggleManager->isDisabled('web.topsellers.enable')) {
  86.                 return null;
  87.             }
  88.             $locationParents $this->getLocationParents($topSeller->getLocation());
  89.             $response $this->httpClient->request(
  90.                 'GET',
  91.                 $this->parameterBag->get('api_gateway.top_sellers.url').'/api/v1/top-sellers',
  92.                 [
  93.                     'query' => [
  94.                         'location' => $topSeller->getLocation(),
  95.                         'propertyType' => $topSeller->getPropertyType(),
  96.                         'section' => $topSeller->getSection(),
  97.                         'locationParents' => $locationParents,
  98.                         'type' => $topSeller->getType(),
  99.                         'hasPersonalPhoto' => $topSeller->hasPersonalPhoto(),
  100.                         'hasCompanyLogo' => $topSeller->hasCompanyLogo(),
  101.                     ],
  102.                     'timeout' => 1,
  103.                     'connect_timeout' => 1,
  104.                 ]
  105.             );
  106.         } catch (GuzzleException|ORMException|\Exception $exception) {
  107.             $this->logger->log(LogLevel::ERROR$exception->getMessage());
  108.             return null;
  109.         }
  110.         return $response;
  111.     }
  112.     /**
  113.      * @return array
  114.      *
  115.      * @throws ORMException
  116.      */
  117.     private function getTopSellersData(array $topSellersstring $locale)
  118.     {
  119.         $topSellersData = [];
  120.         $counter 0;
  121.         /** @var User $topSeller */
  122.         foreach ($this->userRepository->findBy(['id' => array_keys($topSellers)]) as $topSeller) {
  123.             $users = [$topSeller];
  124.             if ($topSeller->getChildren()->count()) {
  125.                 $users array_merge($users$topSeller->getChildren()->toArray());
  126.             }
  127.             $topSellersData[$counter]['user'] = $topSeller;
  128.             $topSellersData[$counter]['liveListingsCount'] = $topSellers[$topSeller->getId()]['listingsCount'];
  129.             $topSellersData[$counter]['leadsCount'] = $topSeller->getClientServedCount();
  130.             $topSellersData[$counter]['location'] = isset($topSellers[$topSeller->getId()]['location']) ?
  131.                 $this->locationManager->getLocation(['id' => $topSellers[$topSeller->getId()]['location']])->getTitle() : null;
  132.             $topSellersData[$counter]['servedLocations'] = $this->locationManager
  133.                 ->buildServingLeveledLocationsArray($users1$locale);
  134.             $topSellersData[$counter]['isCompany'] = $topSellers[$topSeller->getId()]['isCompany'];
  135.             ++$counter;
  136.             $activeListingSort array_column($topSellersData'liveListingsCount');
  137.             array_multisort($activeListingSort, \SORT_DESC$topSellersData);
  138.         }
  139.         return array_group_by($topSellersData'location');
  140.     }
  141.     /**
  142.      * @return array
  143.      */
  144.     public function getTopSellerPersonalData(TopSeller $topSellerstring $locale 'ar')
  145.     {
  146.         $topSellerResponse $this->getTopSellersResponseFromService($topSeller);
  147.         $data $topSellerResponse $topSellerResponse->getBody() : '';
  148.         $topSellers = (array) json_decode((string) $datatrue);
  149.         $topSellersData = [];
  150.         $counter 0;
  151.         /** @var User $topSeller */
  152.         foreach ($this->userRepository->findBy(['id' => array_keys($topSellers)]) as $topSeller) {
  153.             $topSellersData[$counter]['user'] = $topSeller;
  154.             $topSellersData[$counter]['isCompany'] = $topSellers[$topSeller->getId()]['isCompany'];
  155.             $topSellersData[$counter]['id'] = $topSellers[$topSeller->getId()]['user'];
  156.             $topSellersData[$counter]['numberOfActiveListing'] = $topSellers[$topSeller->getId()]['listingsCount'];
  157.             ++$counter;
  158.             $activeListingSort array_column($topSellersData'numberOfActiveListing');
  159.             array_multisort($activeListingSort, \SORT_DESC$topSellersData);
  160.         }
  161.         return $topSellersData;
  162.     }
  163.     public function getTopSellersElasticResponse(Request $request): array
  164.     {
  165.         $request->query->set('aggregatedField''user');
  166.         $request->query->set('bucketsCount'self::TOP_SELLERS_LIMIT);
  167.         $topSellers $this->searchClient->request(
  168.             'GET',
  169.             '/api/listing/histogram',
  170.             [
  171.                 'query' => $request->query->all(),
  172.             ]
  173.         );
  174.         return $topSellers->toArray();
  175.     }
  176.     private function getLocationParents($locationId): array
  177.     {
  178.         $locationParents = [];
  179.         if ($locationId) {
  180.             $locationParents $this->locationService->getAllLocationParentsIds($locationId);
  181.         }
  182.         return $locationParents;
  183.     }
  184. }