3 namespace app\Controller\Github
;
5 use app\Controller\Github
;
7 use app\Model\Accounts
;
12 class Callback
extends Github
19 function __construct(Web
$app, API
$github, Session
$session, Accounts
$accounts) {
20 parent
::__construct($app, $github, $session);
21 $this->accounts
= $accounts;
24 function __invoke(array $args = null) {
25 if ($this->app
->getRequest()->getQuery("error")) {
26 $this->app
->getView()->addData([
27 "error" => $this->app
->getRequest()->getQuery("error_description")
30 $this->github
->fetchToken(
31 $this->app
->getRequest()->getQuery("code"),
32 $this->app
->getRequest()->getQuery("state")
33 )->then(function($result) {
34 list($oauth) = $result;
35 $this->github
->setToken($oauth->access_token
);
36 return $this->github
->readAuthUser()->then(function($result) use($oauth) {
37 list($user) = $result;
38 return [$oauth, $user];
40 })->then(function($result) {
41 list($oauth, $user) = $result;
42 $tx = $this->accounts
->getConnection()->startTransaction();
44 if (($cookie = $this->app
->getRequest()->getCookie("account"))) {
45 $account = $this->accounts
->find(["account=" => $cookie])->current();
46 } elseif (!($account = $this->accounts
->byOAuth("github", $oauth->access_token
, $user->login
))) {
47 $account = $this->accounts
->createOAuthAccount("github", $oauth->access_token
, $user->login
);
49 $token = $account->updateToken("github", $oauth->access_token
, $oauth);
50 $owner = $account->updateOwner("github", $user->login
, $user);
54 $this->login($account, $token, $owner);
57 $this->github
->getClient()->send();
59 if (isset($this->session
->returnto
)) {
60 $returnto = $this->session
->returnto
;
61 unset($this->session
->returnto
);
62 $this->app
->redirect($returnto);
65 $this->app
->getBaseUrl()->mod("./github"));
68 $this->app
->display("github/callback");