radarrplexorganizrnginxsonarrdashboardhtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelanding
		
		
		
		
			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); | |
|     } | |
| }
 | |
| 
 |