X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=app%2FGithub%2FAPI%2FCall.php;h=0e8bd62583b00eda3e9a16bc739427f993881ad3;hb=c05a8f703d5a097355b5813154c264c87e3f71fe;hp=ea9b59a70c461e7d0837e6e650c0eaf8c408e573;hpb=a2af03951ac7fbd032609d0044c0a85704b77771;p=pharext%2Fpharext.org diff --git a/app/Github/API/Call.php b/app/Github/API/Call.php index ea9b59a..0e8bd62 100644 --- a/app/Github/API/Call.php +++ b/app/Github/API/Call.php @@ -3,10 +3,14 @@ namespace app\Github\API; use app\Github\API; +use app\Github\Storage\Item; +use http\Client\Response; use http\QueryString; use http\Url; use merry\Config; +use React\Promise; + abstract class Call { /** @@ -35,9 +39,24 @@ abstract class Call protected $query; /** - * Queue this call to the API client + * @var array + */ + protected $result; + + /** + * @var \React\Promise\Deferred + */ + protected $deferred; + + /** + * @return Request + */ + abstract protected function request(); + + /** + * @return array */ - abstract function enqueue(callable $callback); + abstract protected function response(Response $response); /** * @param API $api @@ -47,6 +66,7 @@ abstract class Call $this->api = $api; $this->config = $this->api->getConfig(); $this->url = new Url($this->config->api->url, null, 0); + $this->deferred = new Promise\Deferred; if ($args) { $this->args = $args; @@ -56,18 +76,26 @@ abstract class Call } } - function __invoke(callable $callback) { - if (empty($this->args["fresh"]) && ($cache = $this->api->getCacheStorage())) { - $key = $this->getCacheKey(); - - if ($cache->get($key, $cached)) { - call_user_func_array($callback, $cached); - return $this->api->getClient(); - } + /** + * @return \React\Promise\Promise + */ + function __invoke() { + if ($this->readFromCache($this->result)) { + return new Promise\FulfilledPromise($this->result); + } else { + $this->api->getClient()->enqueue( + $this->request(), + function($response) { + try { + $this->deferred->resolve($this->response($response)); + } catch (\Exception $e) { + $this->deferred->reject($e); + } + return true; + } + ); + return $this->deferred->promise(); } - - $this->enqueue($callback); - return $this; } /** @@ -83,7 +111,8 @@ abstract class Call * Call Client::send() */ function send() { - return $this->api->getClient()->send(); + $this->api->getClient()->send(); + return $this->result; } /** @@ -101,17 +130,33 @@ abstract class Call function getCacheKey() { $args = $this->args; unset($args["fresh"]); + if (isset($args["page"]) && !strcmp($args["page"], "1")) { + unset($args["page"]); + } ksort($args); - return sprintf("github:%s:%s:%s", $this->api->getToken(), $this, + return sprintf("%s:%s:%s", $this->api->getToken(), $this, new QueryString($args)); } - function readFromCache(array &$cached = null, &$ttl = null) { - if (empty($this->args["fresh"]) && ($cache = $this->api->getCacheStorage())) { - $key = $this->getCacheKey(); - return $cache->get($key, $cached, $ttl); + function readFromCache(array &$value = null) { + if (!empty($this->args["fresh"])) { + return false; + } + if (!($cache = $this->api->getCacheStorage())) { + return false; + } + if (!strlen($key = $this->getCacheKey())) { + return false; + } + if (!$cache->get($key, $cached)) { + return false; + } + if (null !== $this->api->getMaxAge() && $cached->getAge() > $this->api->getMaxAge()) { + return false; } - return false; + $this->api->getLogger()->debug("Cache-Hit: $this", $this->args); + $value = $cached->getValue(); + return true; } function saveToCache(array $fresh) { @@ -119,11 +164,11 @@ abstract class Call if (isset($this->config->storage->cache->{$this}->ttl)) { $ttl = $this->config->storage->cache->{$this}->ttl; } else { - $ttl = 0; + $ttl = null; } $key = $this->getCacheKey(); - $cache->set($key, $fresh, $ttl); + $cache->set($key, new Item($fresh, $ttl)); } }