<?php
namespace App\Service;
use GuzzleHttp\ClientInterface;
use Porpaginas\Arrays\ArrayPage;
use Porpaginas\Page;
class ListingRotationApi
{
private ClientInterface $httpClient;
private int $onPageLimit;
private ProfileTopBoard $profileTopBoard;
public function __construct(ClientInterface $apiRotationClient, $onPageLimit, ProfileTopBoard $profileTopBoard)
{
$this->httpClient = $apiRotationClient;
$this->onPageLimit = (int)$onPageLimit;
$this->profileTopBoard = $profileTopBoard;
}
/**
* @param array $query Набор фильтров листинга, порядок важен
* @param int $pageNumber Номер текущей страницы
* @return Page
*
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function paginate(array $query, int $pageNumber = 1): Page
{
if ($pageNumber < 1) {
$pageNumber = 1;
}
$countTopCTR = $pageNumber > 1;
$topPlacement = $this->profileTopBoard->currentTopPlacement($countTopCTR);
$limit = $this->onPageLimit;
$offset = ($pageNumber - 1) * $limit;
if (null !== $topPlacement) {
if ($pageNumber === 1) {
$limit = $this->onPageLimit - 1;
} else {
$offset = ($pageNumber - 1) * $limit - 1;
}
}
$response = $this->httpClient->request('GET', $this->buildUrl($query), [
'query' => [
'limit' => $limit,
'offset' => $offset,
],
]);
$data = json_decode($response->getBody()->getContents(), true);
$items = $data['items'];
if (null !== $topPlacement) {
array_unshift($items, $topPlacement);
}
return new ArrayPage($items, $data['offset'], $data['limit'], $data['totalCount']);
}
private function buildUrl(array $query): string
{
$url = '/listings';
foreach ($query as $attr => $value) {
$url .= sprintf('/%s/%s', $attr, $value);
}
return $url;
}
}