vendor/store.shopware.com/intediadoofindersw6/src/Doofinder/Api/Search.php line 50

Open in your IDE?
  1. <?php
  2. namespace Intedia\Doofinder\Doofinder\Api;
  3. use GuzzleHttp\Client;
  4. use Psr\Log\LoggerInterface;
  5. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  6. use Shopware\Core\System\SystemConfig\SystemConfigService;
  7. use Symfony\Contracts\Translation\TranslatorInterface;
  8. class Search
  9. {
  10.     const API_VERSION    '5';
  11.     const CLIENT_TIMEOUT 2.5// seconds
  12.     const CONFIG_KEY     'IntediaDoofinderSW6.config.';
  13.     const MAX_RESULTS    1500;
  14.     const PAGE_SIZE      100;
  15.     /** @var SystemConfigService */
  16.     protected $systemConfigService;
  17.     /** @var TranslatorInterface */
  18.     protected $translator;
  19.     /** @var LoggerInterface */
  20.     protected $logger;
  21.     /** @var Client */
  22.     protected $client;
  23.     /** @var string */
  24.     protected $baseUrl;
  25.     /** @var string */
  26.     protected $engineHash;
  27.     /** @var string */
  28.     protected $apiKey;
  29.     /** @var string */
  30.     protected $apiZone;
  31.     /**
  32.      * Search constructor.
  33.      *
  34.      * @param SystemConfigService $systemConfigService
  35.      * @param TranslatorInterface $translator
  36.      * @param LoggerInterface $logger
  37.      */
  38.     public function __construct(SystemConfigService $systemConfigServiceTranslatorInterface $translatorLoggerInterface $logger)
  39.     {
  40.         $this->logger              $logger;
  41.         $this->translator          $translator;
  42.         $this->systemConfigService $systemConfigService;
  43.         if ($this->initConfig()) {
  44.             $this->client = new Client([
  45.                 'base_uri' => $this->baseUrl,
  46.                 'timeout'  => self::CLIENT_TIMEOUT
  47.             ]);
  48.         }
  49.     }
  50.     /**
  51.      * Initializes api with config values
  52.      * @param SalesChannelContext|null $context
  53.      * @return bool
  54.      */
  55.     protected function initConfig(?SalesChannelContext $context null): bool
  56.     {
  57.         $translationHash $this->translator->trans("intedia-doofinder.configuration.hashId") !== "intedia-doofinder.configuration.hashId" $this->translator->trans("intedia-doofinder.configuration.hashId") : null;
  58.         $pluginConfig    $this->systemConfigService->getDomain(self::CONFIG_KEY$context $context->getSalesChannel()->getId() : nulltrue);
  59.         if (!empty($pluginConfig[self::CONFIG_KEY 'apiKey']) && (!empty($pluginConfig[self::CONFIG_KEY 'engineHashId']) || !empty($translationHash)) && !empty($pluginConfig[self::CONFIG_KEY 'searchDomain'])) {
  60.             $apiInfo explode('-'$pluginConfig[self::CONFIG_KEY 'apiKey']);
  61.             if (count($apiInfo) != 2) {
  62.                 return false;
  63.             }
  64.             $this->apiKey     $apiInfo[1];
  65.             $this->apiZone    $apiInfo[0];
  66.             $this->engineHash $translationHash $translationHash $pluginConfig[self::CONFIG_KEY 'engineHashId'];
  67.             $this->baseUrl    sprintf("https://{$pluginConfig[self::CONFIG_KEY 'searchDomain']}/%s/"$this->apiZone,self::API_VERSION);
  68.             return true;
  69.         }
  70.         return false;
  71.     }
  72.     /**
  73.      * @param SalesChannelContext|null $context
  74.      * @return Client
  75.      */
  76.     protected function generateClient(?SalesChannelContext $context null)
  77.     {
  78.         if ($this->initConfig($context)) {
  79.             $this->client = new Client([
  80.                 'base_uri' => $this->baseUrl,
  81.                 'timeout'  => self::CLIENT_TIMEOUT
  82.             ]);
  83.         }
  84.         return $this->client;
  85.     }
  86.     /**
  87.      * @param $term
  88.      * @param SalesChannelContext|null $context
  89.      * @return array
  90.      */
  91.     public function queryIds($term, ?SalesChannelContext $context null)
  92.     {
  93.         if ($context) {
  94.             $this->generateClient($context);
  95.         }
  96.         $resultIds      = [];
  97.         $page           1;
  98.         $dfResponse     $this->queryPage($term$pageself::PAGE_SIZE);
  99.         $productsToLoad self::MAX_RESULTS;
  100.         while ($dfResponse) {
  101.             $dfResults $dfResponse['results'];
  102.             for ($i 0$i count($dfResults) && ($productsToLoad 0); $i++, --$productsToLoad) {
  103.                 if (array_key_exists('group_id'$dfResults[$i])) {
  104.                     $resultIds[$dfResults[$i]['group_id']] = $dfResults[$i]['id'];
  105.                 }
  106.                 else {
  107.                     $resultIds[] = $dfResults[$i]['id'];
  108.                 }
  109.             }
  110.             $dfResponse $page self::PAGE_SIZE $dfResponse['total'] && $productsToLoad $this->queryPage($term, ++$pageself::PAGE_SIZE) : null;
  111.         }
  112.         return $resultIds;
  113.     }
  114.     /**
  115.      * @param $term
  116.      * @param $page
  117.      * @param $rpp
  118.      * @return mixed|null
  119.      */
  120.     protected function queryPage($term$page$rpp)
  121.     {
  122.         try {
  123.             if ($this->client) {
  124.                 $response $this->client->request('GET''search',
  125.                     [
  126.                         'query' => [
  127.                             'hashid' => $this->engineHash,
  128.                             'query'  => $term,
  129.                             'page'   => $page,
  130.                             'rpp'    => $rpp
  131.                         ],
  132.                         'headers' => [
  133.                             'Authorization' => 'Token ' $this->apiKey
  134.                         ]
  135.                     ]
  136.                 );
  137.                 if ($response->getStatusCode() === 200) {
  138.                     return \GuzzleHttp\json_decode($response->getBody(), true);
  139.                 }
  140.             }
  141.         }
  142.         catch (\Exception $e) {
  143.             $this->logger->error("Exception receiving results from doofinder: " $e->getMessage());
  144.         }
  145.         return null;
  146.     }
  147. }