yet another github api refactoring
[pharext/pharext.org] / app / Github / API / Call.php
index ea9b59a70c461e7d0837e6e650c0eaf8c408e573..22a69516e3f7fb60d466e3eac46b1522e6e13122 100644 (file)
@@ -3,6 +3,7 @@
 namespace app\Github\API;
 
 use app\Github\API;
+use app\Github\Storage\Item;
 use http\QueryString;
 use http\Url;
 use merry\Config;
@@ -34,6 +35,11 @@ abstract class Call
         */
        protected $query;
        
+       /**
+        * @var array
+        */
+       protected $result;
+       
        /**
         * Queue this call to the API client
         */
@@ -57,16 +63,11 @@ 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();
-                       }
+               if ($this->readFromCache($this->result)) {
+                       call_user_func_array($callback, $this->result);
+               } else {
+                       $this->enqueue($callback);
                }
-               
-               $this->enqueue($callback);
                return $this;
        }
        
@@ -83,7 +84,8 @@ abstract class Call
         * Call Client::send()
         */
        function send() {
-               return $this->api->getClient()->send();
+               $this->api->getClient()->send();
+               return $this->result;
        }
        
        /**
@@ -101,17 +103,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 +137,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));
                }
        }