* @copyright 2020 DIGITAL RETAIL TECHNOLOGIES SL * @license https://opensource.org/licenses/MIT The MIT License * * Don't forget to prefix your containers with your own identifier * to avoid any conflicts with others containers. */ class RetailcrmApiPaginatedRequest { /** * @var \RetailcrmProxy|\RetailcrmApiClientV5 */ private $api; /** * @var string */ private $method; /** * @var array */ private $params; /** * @var string */ private $dataKey; /** * @var int */ private $limit; /** * @var int|null */ private $pageLimit; /** * @var array */ private $data; /** * RetailcrmApiPaginatedRequest constructor. */ public function __construct() { $this->reset(); } /** * Sets retailCRM api client to request * * @param \RetailcrmApiClientV5|\RetailcrmProxy $api * * @return RetailcrmApiPaginatedRequest */ public function setApi($api) { $this->api = $api; return $this; } /** * Sets API client method to request * * @param string $method * * @return RetailcrmApiPaginatedRequest */ public function setMethod($method) { $this->method = $method; return $this; } /** * Sets method params for API client (leave `{{page}}` instead of page and `{{limit}}` instead of limit) * * @param array $params * * @return RetailcrmApiPaginatedRequest */ public function setParams($params) { $this->params = $params; return $this; } /** * Sets dataKey (key with data in response) * * @param string $dataKey * * @return RetailcrmApiPaginatedRequest */ public function setDataKey($dataKey) { $this->dataKey = $dataKey; return $this; } /** * Sets record limit per request * * @param int $limit * * @return RetailcrmApiPaginatedRequest */ public function setLimit($limit) { $this->limit = $limit; return $this; } /** * Sets page limit per call * * @param int $pageLimit * * @return RetailcrmApiPaginatedRequest */ public function setPageLimit($pageLimit) { $this->pageLimit = $pageLimit; return $this; } /** * Executes request * * @return $this */ public function execute() { $this->data = array(); $response = true; $page = 1; do { $response = call_user_func_array( array($this->api, $this->method), $this->buildParams($this->params, $page) ); if ($response instanceof RetailcrmApiResponse && $response->offsetExists($this->dataKey)) { $this->data = array_merge($this->data, $response[$this->dataKey]); $page = $response['pagination']['currentPage'] + 1; } if($this->pageLimit !== null && $page > $this->pageLimit) { break; } time_nanosleep(0, 300000000); } while ($response && (isset($response['pagination']) && $response['pagination']['currentPage'] < $response['pagination']['totalPageCount'])); return $this; } /** * Returns data * * @return array */ public function getData() { return $this->data; } /** * Reset paginated request * * @return $this */ public function reset() { $this->method = ''; $this->limit = 100; $this->pageLimit = null; $this->data = array(); return $this; } /** * buildParams * * @param array $placeholderParams * @param int $currentPage * * @return mixed */ private function buildParams($placeholderParams, $currentPage) { foreach ($placeholderParams as $key => $param) { if ($param == '{{page}}') { $placeholderParams[$key] = $currentPage; } if ($param == '{{limit}}') { $placeholderParams[$key] = $this->limit; } } return $placeholderParams; } }