setStatusCode(302); $response->headers->set('Location', '/login?return_to='.$request->getPathInfo()); return false; } else { return true; } } public function index(Request $request, Response $response) { $response->setContent(view('index', [ 'title' => 'Telegraph' ])); return $response; } public function dashboard(Request $request, Response $response) { if(!$this->_is_logged_in($request, $response)) { return $response; } // Default to load their first site, but let the query string override it $role = ORM::for_table('roles')->join('sites', 'roles.site_id = sites.id') ->where('user_id', session('user_id'))->order_by_asc('sites.created_at')->find_one(); if($request->get('account')) { $role = ORM::for_table('roles')->where('user_id', session('user_id'))->where('site_id', $request->get('account'))->find_one(); // Check that the user has permission to access this account if(!$role) { $response->setStatusCode(302); $response->headers->set('Location', '/dashboard'); return $response; } } $site = ORM::for_table('sites')->where_id_is($role->site_id)->find_one(); $query = ORM::for_table('webmentions')->where('site_id', $site->id) ->order_by_desc('created_at') ->limit(20) ->find_many(); $webmentions = []; foreach($query as $m) { $statuses = ORM::for_table('webmention_status')->where('webmention_id', $m->id)->order_by_desc('created_at')->find_many(); if(count($statuses) == 0) { $icon = 'wait'; $status = 'pending'; } else { $status = $statuses[0]->status; switch($status) { case 'success': case 'accepted': $icon = 'checkmark'; break; case 'not_supported': case 'error': $icon = 'warning'; break; default: $icon = ''; } } $webmentions[] = [ 'webmention' => $m, 'statuses' => $statuses, 'status' => $status, 'icon' => $icon ]; } $response->setContent(view('dashboard', [ 'title' => 'Telegraph Dashboard', 'user' => $this->_user(), 'accounts' => $this->_accounts(), 'site' => $site, 'webmentions' => $webmentions ])); return $response; } public function webmention_details(Request $request, Response $response, $args) { if(!$this->_is_logged_in($request, $response)) { return $response; } // Look up the webmention by its token $webmention = ORM::for_table('webmentions')->where('token', $args['code'])->find_one(); if(!$webmention) { $response->setContent(view('not-found')); return $response; } $site = ORM::for_table('sites')->where_id_is($webmention->site_id)->find_one(); $statuses = ORM::for_table('webmention_status')->where('webmention_id', $webmention->id)->order_by_desc('created_at')->find_many(); $response->setContent(view('webmention-details', [ 'title' => 'Webmention Details', 'user' => $this->_user(), 'accounts' => $this->_accounts(), 'site' => $site, 'webmention' => $webmention, 'statuses' => $statuses ])); return $response; } private function _user() { return ORM::for_table('users')->where_id_is(session('user_id'))->find_one(); } private function _accounts() { return ORM::for_table('sites')->join('roles', 'roles.site_id = sites.id') ->where('roles.user_id', session('user_id')) ->find_many(); } }