namespace app\Github;
+use app\Github\API;
use app\Github\Storage;
use app\Github\Exception;
use http\QueryString;
use http\Url;
+use Psr\Log\LoggerInterface;
+
class API
{
/**
* @var merry\Config
*/
private $config;
+
+ /**
+ * @var int
+ */
+ private $maxAge;
+
+ /**
+ * @var \Psr\Log\LoggerInterface;
+ */
+ private $logger;
- function __construct(Config $config, Storage $tokens = null, Storage $cache = null) {
+ function __construct(Config $config, LoggerInterface $logger, Storage $tokens = null, Storage $cache = null) {
+ $this->logger = $logger;
$this->config = $config;
$this->client = new Client;
+ $this->client->attach(new ClientObserver($logger));
$this->tokens = $tokens ?: new Storage\Session;
$this->cache = $cache;
}
+
+ /**
+ * Set maximum acceptable age of cache items
+ * @param int $seconds
+ */
+ function setMaxAge($seconds) {
+ $this->maxAge = $seconds;
+ return $this;
+ }
+
+ function getMaxAge() {
+ return $this->maxAge;
+ }
+
+ function getLogger() {
+ return $this->logger;
+ }
function getConfig() {
return $this->config;
}
function setToken($token) {
- $this->tokens->set("access_token", $token,
- $this->config->storage->token->ttl);
+ $this->tokens->set("access_token", new Storage\Item(
+ $token,
+ $this->config->storage->token->ttl
+ ));
}
function getToken() {
- if ($this->tokens->get("access_token", $token, $ttl, true)) {
- return $token;
+ if ($this->tokens->get("access_token", $token, true)) {
+ return $token->getValue();
}
- if (isset($ttl)) {
- throw new Exception\TokenExpired($ttl);
+ if (isset($token)) {
+ $this->logger->notice("Token expired", $token);
+ throw new Exception\TokenExpired($token->getLTL());
}
throw new Exception\TokenNotSet;
}
function getAuthUrl($callback_url) {
$state = base64_encode(openssl_random_pseudo_bytes(24));
- $this->tokens->set("state", $state, 5*60);
+ $this->tokens->set("state", new Storage\Item($state, 5*60));
$param = [
"state" => $state,
"client_id" => $this->config->client->id,
}
function fetchToken($code, $state, callable $callback) {
- if (!$this->tokens->get("state", $orig_state, $ttl, true)) {
- if (isset($ttl)) {
- throw new Exception\StateExpired($ttl);
+ if (!$this->tokens->get("state", $orig_state, true)) {
+ if (isset($orig_state)) {
+ $this->logger->notice("State expired", $orig_state);
+ throw new Exception\StateExpired($orig_state->getLTL());
}
throw new Exception\StateNotSet;
}
- if ($state !== $orig_state) {
- throw new Exception\StateMismatch($orig_state, $state);
+ if ($state !== $orig_state->getValue()) {
+ $this->logger->warning("State mismatch", compact("state", "orig_state"));
+ throw new Exception\StateMismatch($orig_state->getValue(), $state);
}
-
- $fetch = new Fetch\Token($this, compact("code") + $this->config->client->toArray());
- return $fetch($callback);
+
+ $call = new API\Users\ReadAuthToken($this, [
+ "code" => $code,
+ "client_id" => $this->config->client->id,
+ "client_secret" => $this->config->client->secret,
+ ]);
+ return $call($callback);
}
- function fetchUser(callable $callback) {
- $fetch = new Fetch\User($this);
- return $fetch($callback);
+ function readAuthUser(callable $callback) {
+ $call = new API\Users\ReadAuthUser($this);
+ return $call($callback);
+ }
+
+ function listRepos($page, callable $callback) {
+ $call = new API\Repos\ListRepos($this, compact("page"));
+ return $call($callback);
}
- function fetchRepos($page, callable $callback) {
- $fetch = new Fetch\Repos($this);
- $fetch->setPage($page);
- return $fetch($callback);
+ function readRepo($repo, callable $callback) {
+ $call = new API\Repos\ReadRepo($this, compact("repo"));
+ return $call($callback);
}
- function fetchRepo($repo, callable $callback) {
- $fetch = new Fetch\Repo($this, compact("repo"));
- return $fetch($callback);
+ /**
+ * Check if the pharext webhook is set for the repo and return it
+ * @param object $repo
+ * @return stdClass hook
+ */
+ function checkRepoHook($repo) {
+ if ($repo->hooks) {
+ foreach ($repo->hooks as $hook) {
+ if ($hook->name === "web" && $hook->config->url === $this->config->hook->url) {
+ return $hook;
+ }
+ }
+ }
+ return null;
}
- function fetchHooks($repo, callable $callback) {
- $fetch = new Fetch\Hooks($this, compact("repo"));
- return $fetch($callback);
+ function listHooks($repo, callable $callback) {
+ $call = new API\Hooks\ListHooks($this, compact("repo"));
+ return $call($callback);
}
- function fetchReleases($repo, $page, callable $callback) {
- $fetch = new Fetch\Releases($this, compact("repo"));
- $fetch->setPage($page);
- return $fetch($callback);
+ function listReleases($repo, $page, callable $callback) {
+ $call = new API\Releases\ListReleases($this, compact("repo", "page"));
+ return $call($callback);
}
- function fetchTags($repo, $page, callable $callback) {
- $fetch = new Fetch\Tags($this, compact("repo"));
- $fetch->setPage($page);
- return $fetch($callback);
+ function listTags($repo, $page, callable $callback) {
+ $call = new API\Tags\ListTags($this, compact("repo", "page"));
+ return $call($callback);
}
- function fetchContents($repo, $path, callable $callback) {
- $fetch = new Fetch\Contents($this, compact("repo", "path"));
- return $fetch($callback);
+ function readContents($repo, $path, callable $callback) {
+ $call = new API\Repos\ReadContents($this, compact("repo", "path"));
+ return $call($callback);
}
function createRepoHook($repo, $conf, callable $callback) {
- $create = new Create\Webhook($this, compact("repo", "conf"));
- return $create($callback);
+ $call = new API\Hooks\CreateHook($this, compact("repo", "conf"));
+ return $call($callback);
}
function updateRepoHook($repo, $id, $conf, callable $callback) {
- $update = new Update\Webhook($this, compact("repo", "id", "conf"));
- return $update($callback);
+ $call = new API\Hooks\UpdateHook($this, compact("repo", "id", "conf"));
+ return $call($callback);
}
function deleteRepoHook($repo, $id, callable $callback) {
- $delete = new Delete\Webhook($this, compact("repo", "id"));
- return $delete($callback);
+ $call = new API\Hooks\DeleteHook($this, compact("repo", "id"));
+ return $call($callback);
}
function createRelease($repo, $tag, callable $callback) {
- $create = new Create\Release($this, compact("repo", "tag"));
- return $create($callback);
+ $call = new API\Releases\CreateRelease($this, compact("repo", "tag"));
+ return $call($callback);
}
function createReleaseAsset($url, $asset, $type, callable $callback) {
- $create = new Create\ReleaseAsset($this, compact("url", "asset", "type"));
- return $create($callback);
+ $call = new API\Releases\CreateReleaseAsset($this, compact("url", "asset", "type"));
+ return $call($callback);
+ }
+
+ function listReleaseAssets($repo, $id, callable $callback) {
+ $call = new API\Releases\ListReleaseAssets($this, compact("repo", "id"));
+ return $call($callback);
}
}