%PDF- %GIF98; %PNG;
Server : ApacheSystem : Linux host.digitalbabaji.in 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64 User : addictionfreeind ( 1003) PHP Version : 7.2.34 Disable Function : exec,passthru,shell_exec,system Directory : /home/addictionfreeind/public_html/admin1/vendor/m4tthumphrey/php-gitlab-api/src/ |
Upload File : |
<?php
declare(strict_types=1);
/*
* This file is part of the Gitlab API library.
*
* (c) Matt Humphrey <matth@windsor-telecom.co.uk>
* (c) Graham Campbell <hello@gjcampbell.co.uk>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Gitlab;
use Closure;
use Generator;
use Gitlab\Api\AbstractApi;
use Gitlab\Exception\RuntimeException;
use Gitlab\HttpClient\Message\ResponseMediator;
use ValueError;
/**
* This is the result pager class.
*
* @author Ramon de la Fuente <ramon@future500.nl>
* @author Mitchel Verschoof <mitchel@future500.nl>
* @author Graham Campbell <hello@gjcampbell.co.uk>
*/
final class ResultPager implements ResultPagerInterface
{
/**
* The default number of entries to request per page.
*
* @var int
*/
private const PER_PAGE = 50;
/**
* The client to use for pagination.
*
* @var Client
*/
private $client;
/**
* The number of entries to request per page.
*
* @var int
*/
private $perPage;
/**
* The pagination result from the API.
*
* @var array<string,string>
*/
private $pagination;
/**
* Create a new result pager instance.
*
* @param Client $client
* @param int|null $perPage
*
* @return void
*/
public function __construct(Client $client, int $perPage = null)
{
if (null !== $perPage && ($perPage < 1 || $perPage > 100)) {
throw new ValueError(\sprintf('%s::__construct(): Argument #2 ($perPage) must be between 1 and 100, or null', self::class));
}
$this->client = $client;
$this->perPage = $perPage ?? self::PER_PAGE;
$this->pagination = [];
}
/**
* Fetch a single result from an api call.
*
* @param AbstractApi $api
* @param string $method
* @param array $parameters
*
* @throws \Http\Client\Exception
*
* @return array
*/
public function fetch(AbstractApi $api, string $method, array $parameters = []): array
{
$result = self::bindPerPage($api, $this->perPage)->$method(...$parameters);
if (!\is_array($result)) {
throw new RuntimeException('Pagination of this endpoint is not supported.');
}
$this->postFetch();
return $result;
}
/**
* Fetch all results from an api call.
*
* @param AbstractApi $api
* @param string $method
* @param array $parameters
*
* @throws \Http\Client\Exception
*
* @return array
*/
public function fetchAll(AbstractApi $api, string $method, array $parameters = []): array
{
return \iterator_to_array($this->fetchAllLazy($api, $method, $parameters));
}
/**
* Lazily fetch all results from an api call.
*
* @param AbstractApi $api
* @param string $method
* @param array $parameters
*
* @throws \Http\Client\Exception
*
* @return \Generator
*/
public function fetchAllLazy(AbstractApi $api, string $method, array $parameters = []): Generator
{
/** @var mixed $value */
foreach ($this->fetch($api, $method, $parameters) as $value) {
yield $value;
}
while ($this->hasNext()) {
/** @var mixed $value */
foreach ($this->fetchNext() as $value) {
yield $value;
}
}
}
/**
* Check to determine the availability of a next page.
*
* @return bool
*/
public function hasNext(): bool
{
return isset($this->pagination['next']);
}
/**
* Fetch the next page.
*
* @throws \Http\Client\Exception
*
* @return array
*/
public function fetchNext(): array
{
return $this->get('next');
}
/**
* Check to determine the availability of a previous page.
*
* @return bool
*/
public function hasPrevious(): bool
{
return isset($this->pagination['prev']);
}
/**
* Fetch the previous page.
*
* @throws \Http\Client\Exception
*
* @return array
*/
public function fetchPrevious(): array
{
return $this->get('prev');
}
/**
* Fetch the first page.
*
* @throws \Http\Client\Exception
*
* @return array
*/
public function fetchFirst(): array
{
return $this->get('first');
}
/**
* Fetch the last page.
*
* @throws \Http\Client\Exception
*
* @return array
*/
public function fetchLast(): array
{
return $this->get('last');
}
/**
* Refresh the pagination property.
*
* @return void
*/
private function postFetch(): void
{
$response = $this->client->getLastResponse();
$this->pagination = null === $response ? [] : ResponseMediator::getPagination($response);
}
/**
* @param string $key
*
* @throws \Http\Client\Exception
*
* @return array
*/
private function get(string $key): array
{
$pagination = $this->pagination[$key] ?? null;
if (null === $pagination) {
return [];
}
$result = $this->client->getHttpClient()->get($pagination);
$content = ResponseMediator::getContent($result);
if (!\is_array($content)) {
throw new RuntimeException('Pagination of this endpoint is not supported.');
}
$this->postFetch();
return $content;
}
/**
* @param \Gitlab\Api\AbstractApi $api
* @param int $perPage
*
* @return \Gitlab\Api\AbstractApi
*/
private static function bindPerPage(AbstractApi $api, int $perPage): AbstractApi
{
/** @var Closure(AbstractApi): AbstractApi */
$closure = Closure::bind(static function (AbstractApi $api) use ($perPage): AbstractApi {
$clone = clone $api;
$clone->perPage = $perPage;
return $clone;
}, null, AbstractApi::class);
return $closure($api);
}
}