sonarrradarrplexorganizrnginxdashboardlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximux
		
		
		
		
			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);
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 |