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($this->app
->getRequest()->getQuery()->toArray());
28 $this->validateUser();
30 if (isset($this->session
->returnto
)) {
31 $returnto = $this->session
->returnto
;
32 unset($this->session
->returnto
);
33 $this->app
->redirect($returnto);
36 $this->app
->getBaseUrl()->mod(":./github"));
39 $this->app
->display("github/callback");
42 private function validateUser() {
43 $this->github
->fetchToken(
44 $this->app
->getRequest()->getQuery("code"),
45 $this->app
->getRequest()->getQuery("state")
46 )->then(function($result) use (&$oauth) {
47 list($oauth) = $result;
48 $this->github
->setToken($oauth->access_token
);
49 return $this->github
->readAuthUser();
50 })->done(function($result) use(&$oauth) {
51 list($user) = $result;
52 $this->login(...$this->persistUser($oauth, $user));
55 $this->github
->drain();
58 private function persistUser($oauth, $user) {
59 $tx = $this->accounts
->getConnection()->startTransaction();
61 if (($cookie = $this->app
->getRequest()->getCookie("account"))) {
62 $account = $this->accounts
->find(["account=" => $cookie])->current();
63 } elseif (!($account = $this->accounts
->byOAuth("github", $oauth->access_token
, $user->login
))) {
64 $account = $this->accounts
->createOAuthAccount("github", $oauth->access_token
, $user->login
);
66 $token = $account->updateToken("github", $oauth->access_token
, $oauth);
67 $owner = $account->updateOwner("github", $user->login
, $user);
71 return [$account, $token, $owner];