1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165:
<?php
namespace Angelfon\SDK;
use Angelfon\SDK\Version;
use Angelfon\SDK\Http\Response;
use Angelfon\SDK\Exceptions\RestException;
abstract class Page implements \Iterator
{
protected static $metaKeys = array(
'end',
'first_page_uri',
'next_page_uri',
'last_page_uri',
'page',
'page_size',
'previous_page_uri',
'total',
'num_pages',
'start',
'uri',
);
protected $version;
protected $payload;
protected $solution;
protected $records;
abstract public function buildInstance(array $payload);
public function __construct(Version $version, Response $response) {
$payload = $this->processResponse($response);
$this->version = $version;
$this->payload = $payload;
$this->solution = array();
$this->records = new \ArrayIterator($this->loadPage());
}
protected function processResponse(Response $response) {
$content = $response->getContent();
if ($response->getStatusCode() != 200 && !$this->isPagingEol($response->getContent())) {
$message = '[HTTP ' . $response->getStatusCode() . '] Unable to fetch page';
$code = $response->getStatusCode();
if (is_array($content)) {
if (array_key_exists('message', $content))
throw new RestException($content['message'], $code, $code);
else if (array_key_exists('data', $content))
throw new RestException($content['data'], $content['error'], $code);
else throw new RestException();
}
throw new RestException($message, $code, $response->getStatusCode());
}
return $content;
}
protected function isPagingEol($content) {
return !is_null($content) && array_key_exists('data', $content) && $content['data'] == null;
}
protected function loadPage() {
return $this->payload['data'];
}
public function getPreviousPageUrl() {
if ($this->hasMeta('previous_page_url')) {
return $this->getMeta('previous_page_url');
} else if (array_key_exists('previous_page_uri', $this->payload) && $this->payload['previous_page_uri']) {
return $this->getVersion()->getDomain()->absoluteUrl($this->payload['previous_page_uri']);
}
return null;
}
public function getNextPageUrl() {
if ($this->hasMeta('next_page_url')) {
return $this->getMeta('next_page_url');
} else if (array_key_exists('next_page_uri', $this->payload) && $this->payload['next_page_uri']) {
return $this->getVersion()->getDomain()->absoluteUrl($this->payload['next_page_uri']);
}
return null;
}
public function nextPage() {
if (!$this->getNextPageUrl()) {
return null;
}
$response = $this->getVersion()->getDomain()->getClient()->request('GET', $this->getNextPageUrl());
return new static($this->getVersion(), $response, $this->solution);
}
public function previousPage() {
if (!$this->getPreviousPageUrl()) {
return null;
}
$response = $this->getVersion()->getDomain()->getClient()->request('GET', $this->getPreviousPageUrl());
return new static($this->getVersion(), $response, $this->solution);
}
public function current() {
return $this->buildInstance($this->records->current());
}
public function next() {
$this->records->next();
}
public function key() {
return $this->records->key();
}
public function valid() {
return $this->records->valid();
}
public function rewind() {
$this->records->rewind();
}
public function getVersion() {
return $this->version;
}
public function __toString() {
return '[Page]';
}
}