646d782f20d52c59676efdbd23a72a39ddd3c5ba
[pharext/pharext.org] / app / Controller / Github / Callback.php
1 <?php
2
3 namespace app\Controller\Github;
4
5 use app\Controller\Github;
6 use app\Github\API;
7 use app\Model\Accounts;
8 use app\Session;
9 use app\Web;
10
11 class Callback extends Github
12 {
13 /**
14 * @var Accounts
15 */
16 private $accounts;
17
18 function __construct(Web $app, API $github, Session $session, Accounts $accounts) {
19 parent::__construct($app, $github, $session);
20 $this->accounts = $accounts;
21 }
22
23 function __invoke(array $args = null) {
24 if ($this->app->getRequest()->getQuery("error")) {
25 $this->app->getView()->addData([
26 "error" => $this->app->getRequest()->getQuery("error_description")
27 ]);
28 } else {
29 $this->github->fetchToken(
30 $this->app->getRequest()->getQuery("code"),
31 $this->app->getRequest()->getQuery("state"),
32 function($token) {
33 $this->github->setToken($token->access_token);
34 $this->github->readAuthUser($this->createUserCallback($token));
35 })->send();
36 if (isset($this->session->returnto)) {
37 $returnto = $this->session->returnto;
38 unset($this->session->returnto);
39 $this->app->redirect($returnto);
40 } else {
41 $this->app->redirect(
42 $this->app->getBaseUrl()->mod("./github"));
43 }
44 }
45 $this->app->display("github/callback");
46 }
47
48 function createUserCallback($token) {
49 return function($user) use($token) {
50 $tx = $this->accounts->getConnection()->startTransaction();
51
52 if (!($account = $this->accounts->byOAuth("github", $token->access_token, $user->login))) {
53 $account = $this->accounts->createOAuthAccount("github", $token->access_token, $user->login);
54 }
55 $account->updateToken("github", $token->access_token, $token);
56 $owner = $account->updateOwner("github", $user->login, $user);
57
58 $tx->commit();
59
60 $this->session->account = $account->account->get();
61 $this->session->github = (object) $owner->export();
62 };
63 }
64 }