src/Service/ListingRotationApi.php line 29

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use GuzzleHttp\ClientInterface;
  4. use Porpaginas\Arrays\ArrayPage;
  5. use Porpaginas\Page;
  6. class ListingRotationApi
  7. {
  8.     private ClientInterface $httpClient;
  9.     private int $onPageLimit;
  10.     private ProfileTopBoard $profileTopBoard;
  11.     public function __construct(ClientInterface $apiRotationClient$onPageLimitProfileTopBoard $profileTopBoard)
  12.     {
  13.         $this->httpClient $apiRotationClient;
  14.         $this->onPageLimit = (int)$onPageLimit;
  15.         $this->profileTopBoard $profileTopBoard;
  16.     }
  17.     /**
  18.      * @param array $query Набор фильтров листинга, порядок важен
  19.      * @param int $pageNumber Номер текущей страницы
  20.      * @return Page
  21.      *
  22.      * @throws \GuzzleHttp\Exception\GuzzleException
  23.      */
  24.     public function paginate(array $queryint $pageNumber 1): Page
  25.     {
  26.         if ($pageNumber 1) {
  27.             $pageNumber 1;
  28.         }
  29.         $countTopCTR $pageNumber 1;
  30.         $topPlacement $this->profileTopBoard->currentTopPlacement($countTopCTR);
  31.         $limit $this->onPageLimit;
  32.         $offset = ($pageNumber 1) * $limit;
  33.         if (null !== $topPlacement) {
  34.             if ($pageNumber === 1) {
  35.                 $limit $this->onPageLimit 1;
  36.             } else {
  37.                 $offset = ($pageNumber 1) * $limit 1;
  38.             }
  39.         }
  40.         $response $this->httpClient->request('GET'$this->buildUrl($query), [
  41.             'query' => [
  42.                 'limit' => $limit,
  43.                 'offset' => $offset,
  44.             ],
  45.         ]);
  46.         $data json_decode($response->getBody()->getContents(), true);
  47.         $items $data['items'];
  48.         if (null !== $topPlacement) {
  49.             array_unshift($items$topPlacement);
  50.         }
  51.         return new ArrayPage($items$data['offset'], $data['limit'], $data['totalCount']);
  52.     }
  53.     private function buildUrl(array $query): string
  54.     {
  55.         $url '/listings';
  56.         foreach ($query as $attr => $value) {
  57.             $url .= sprintf('/%s/%s'$attr$value);
  58.         }
  59.         return $url;
  60.     }
  61. }