flush
[pharext/pharext.org] / app / Controller / Github / Callback.php
index 5b62faa3251cb9e234c34205119c95879b065f2c..d6d11920c6bd14ab3ecd465356536b1b49e94175 100644 (file)
@@ -3,9 +3,25 @@
 namespace app\Controller\Github;
 
 use app\Controller\Github;
+use app\Github\API;
+use app\Github\Exception;
+use app\Model\Accounts;
+use app\Session;
+use app\Web;
 
 class Callback extends Github
 {
+       
+       /**
+        * @var Accounts
+        */
+       private $accounts;
+       
+       function __construct(Web $app, API $github, Session $session, Accounts $accounts) {
+               parent::__construct($app, $github, $session);
+               $this->accounts = $accounts;
+       }
+       
        function __invoke(array $args = null) {
                if ($this->app->getRequest()->getQuery("error")) {
                        $this->app->getView()->addData([
@@ -16,22 +32,39 @@ class Callback extends Github
                                $this->github->fetchToken(
                                        $this->app->getRequest()->getQuery("code"),
                                        $this->app->getRequest()->getQuery("state"),
-                                       function($json) {
-                                               $this->github->setToken($json->access_token);
-                                               $this->github->fetchUser(function($user) {
-                                                       $this->session->github = $user;
-                                               });
+                                       function($token) {
+                                               $this->github->setToken($token->access_token);
+                                               $this->github->fetchUser($this->createUserCallback($token));
                                })->send();
                                if (isset($this->session->returnto)) {
-                                       $this->app->redirect($this->session->returnto);
+                                       $returnto = $this->session->returnto;
+                                       unset($this->session->returnto);
+                                       $this->app->redirect($returnto);
                                } else {
                                        $this->app->redirect(
                                                $this->app->getBaseUrl()->mod("./github"));
                                }
-                       } catch (\app\Github\Exception $exception) {
+                       } catch (Exception $exception) {
                                $this->app->getView()->addData(compact("exception"));
                        }
                }
                $this->app->display("github/callback");
        }
+       
+       function createUserCallback($token) {
+               return function($user) use($token) {
+                       $tx = $this->accounts->getConnection()->startTransaction();
+                       
+                       if (!($account = $this->accounts->byOAuth("github", $token->access_token, $user->login))) {
+                               $account = $this->accounts->createOAuthAccount("github", $token->access_token, $user->login);
+                       }
+                       $account->updateToken("github", $token->access_token, $token);
+                       $owner = $account->updateOwner("github", $user->login, $user);
+                       
+                       $tx->commit();
+                       
+                       $this->session->account = $account->account->get();
+                       $this->session->github = (object) $owner->export();
+               };
+       }
 }