nginxsonarrradarrplexorganizrdashboardapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmark
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
4.0 KiB
194 lines
4.0 KiB
<?php
|
|
|
|
namespace Github;
|
|
|
|
use Github\Api\ApiInterface;
|
|
use Github\Api\Search;
|
|
use Github\HttpClient\Message\ResponseMediator;
|
|
|
|
/**
|
|
* Pager class for supporting pagination in github classes.
|
|
*
|
|
* @author Ramon de la Fuente <ramon@future500.nl>
|
|
* @author Mitchel Verschoof <mitchel@future500.nl>
|
|
*/
|
|
class ResultPager implements ResultPagerInterface
|
|
{
|
|
/**
|
|
* The GitHub Client to use for pagination.
|
|
*
|
|
* @var \Github\Client
|
|
*/
|
|
protected $client;
|
|
|
|
/**
|
|
* Comes from pagination headers in Github API results.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $pagination;
|
|
|
|
/**
|
|
* The Github client to use for pagination.
|
|
*
|
|
* This must be the same instance that you got the Api instance from.
|
|
*
|
|
* Example code:
|
|
*
|
|
* $client = new \Github\Client();
|
|
* $api = $client->api('someApi');
|
|
* $pager = new \Github\ResultPager($client);
|
|
*
|
|
* @param \Github\Client $client
|
|
*/
|
|
public function __construct(Client $client)
|
|
{
|
|
$this->client = $client;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getPagination()
|
|
{
|
|
return $this->pagination;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function fetch(ApiInterface $api, $method, array $parameters = [])
|
|
{
|
|
$result = $this->callApi($api, $method, $parameters);
|
|
$this->postFetch();
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function fetchAll(ApiInterface $api, $method, array $parameters = [])
|
|
{
|
|
$isSearch = $api instanceof Search;
|
|
|
|
// get the perPage from the api
|
|
$perPage = $api->getPerPage();
|
|
|
|
// set parameters per_page to GitHub max to minimize number of requests
|
|
$api->setPerPage(100);
|
|
|
|
try {
|
|
$result = $this->callApi($api, $method, $parameters);
|
|
$this->postFetch();
|
|
|
|
if ($isSearch) {
|
|
$result = isset($result['items']) ? $result['items'] : $result;
|
|
}
|
|
|
|
while ($this->hasNext()) {
|
|
$next = $this->fetchNext();
|
|
|
|
if ($isSearch) {
|
|
$result = array_merge($result, $next['items']);
|
|
} else {
|
|
$result = array_merge($result, $next);
|
|
}
|
|
}
|
|
} finally {
|
|
// restore the perPage
|
|
$api->setPerPage($perPage);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function postFetch()
|
|
{
|
|
$this->pagination = ResponseMediator::getPagination($this->client->getLastResponse());
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function hasNext()
|
|
{
|
|
return $this->has('next');
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function fetchNext()
|
|
{
|
|
return $this->get('next');
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function hasPrevious()
|
|
{
|
|
return $this->has('prev');
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function fetchPrevious()
|
|
{
|
|
return $this->get('prev');
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function fetchFirst()
|
|
{
|
|
return $this->get('first');
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function fetchLast()
|
|
{
|
|
return $this->get('last');
|
|
}
|
|
|
|
/**
|
|
* @param string $key
|
|
*/
|
|
protected function has($key)
|
|
{
|
|
return !empty($this->pagination) && isset($this->pagination[$key]);
|
|
}
|
|
|
|
/**
|
|
* @param string $key
|
|
*/
|
|
protected function get($key)
|
|
{
|
|
if ($this->has($key)) {
|
|
$result = $this->client->getHttpClient()->get($this->pagination[$key]);
|
|
$this->postFetch();
|
|
|
|
return ResponseMediator::getContent($result);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param ApiInterface $api
|
|
* @param string $method
|
|
* @param array $parameters
|
|
*
|
|
* @return mixed
|
|
*/
|
|
protected function callApi(ApiInterface $api, $method, array $parameters)
|
|
{
|
|
return call_user_func_array([$api, $method], $parameters);
|
|
}
|
|
}
|
|
|