diff --git a/controllers/Controller.php b/controllers/Controller.php index af37e56..77e7896 100644 --- a/controllers/Controller.php +++ b/controllers/Controller.php @@ -4,7 +4,13 @@ use Symfony\Component\HttpFoundation\Response; class Controller { - private function _is_logged_in(&$request, &$response) { + public $http; + + public function __construct() { + $this->http = new Telegraph\HTTP(); + } + + private function _is_logged_in(Request $request, Response $response) { session_start(); if(!session('user_id')) { session_destroy(); @@ -16,6 +22,24 @@ class Controller { } } + private function _get_role(Request $request) { + // 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 false; + } + } + + return $role; + } + public function index(Request $request, Response $response) { $response->setContent(view('index', [ 'title' => 'Telegraph' @@ -28,18 +52,8 @@ class Controller { 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; - } + if(!$role=$this->_get_role($request, $response)) { + return $response; } $site = ORM::for_table('sites')->where_id_is($role->site_id)->find_one(); @@ -117,6 +131,48 @@ class Controller { return $response; } + public function dashboard_send(Request $request, Response $response) { + if(!$this->_is_logged_in($request, $response)) { + return $response; + } + + if(!$role=$this->_get_role($request, $response)) { + return $response; + } + + $site = ORM::for_table('sites')->where_id_is($role->site_id)->find_one(); + + $response->setContent(view('webmention-send', [ + 'title' => 'Webmention Details', + 'user' => $this->_user(), + 'accounts' => $this->_accounts(), + 'site' => $site, + 'role' => $role, + 'url' => $request->get('url') + ])); + return $response; + } + + public function get_outgoing_links(Request $request, Response $response) { + if(!$this->_is_logged_in($request, $response)) { + return $response; + } + + $sourceURL = $request->get('url'); + + $client = new IndieWeb\MentionClient(); + $source = $this->http->get($sourceURL); + $parsed = \Mf2\parse($source['body'], $sourceURL); + + $links = $client->findOutgoingLinks($parsed); + + $response->headers->set('Content-Type', 'application/json'); + $response->setContent(json_encode([ + 'links' => array_values($links) + ])); + return $response; + } + private function _user() { return ORM::for_table('users')->where_id_is(session('user_id'))->find_one(); } diff --git a/public/index.php b/public/index.php index 34fdaff..bfe307b 100644 --- a/public/index.php +++ b/public/index.php @@ -10,10 +10,12 @@ $templates = new League\Plates\Engine(dirname(__FILE__).'/../views'); $router->addRoute('GET', '/', 'Controller::index'); $router->addRoute('GET', '/dashboard', 'Controller::dashboard'); $router->addRoute('GET', '/api', 'Controller::api'); +$router->addRoute('GET', '/webmention/{code}/details', 'Controller::webmention_details'); +$router->addRoute('GET', '/dashboard/send', 'Controller::dashboard_send'); +$router->addRoute('POST', '/dashboard/get_outgoing_links.json', 'Controller::get_outgoing_links'); $router->addRoute('POST', '/webmention', 'API::webmention'); $router->addRoute('GET', '/webmention/{code}', 'API::webmention_status'); -$router->addRoute('GET', '/webmention/{code}/details', 'Controller::webmention_details'); $router->addRoute('GET', '/login', 'Auth::login'); $router->addRoute('GET', '/logout', 'Auth::logout'); diff --git a/views/dashboard.php b/views/dashboard.php index 7b06f07..4be1b75 100644 --- a/views/dashboard.php +++ b/views/dashboard.php @@ -2,8 +2,15 @@
+
+
+ + +
+ +
- +
diff --git a/views/layout-loggedin.php b/views/layout-loggedin.php index 101551d..4fe87d1 100644 --- a/views/layout-loggedin.php +++ b/views/layout-loggedin.php @@ -15,9 +15,11 @@ e($account->name) ?> +
Log Out diff --git a/views/webmention-send.php b/views/webmention-send.php new file mode 100644 index 0000000..a45fa50 --- /dev/null +++ b/views/webmention-send.php @@ -0,0 +1,46 @@ +layout('layout-loggedin', ['title' => $title, 'accounts' => $accounts, 'user' => $user]); ?> + +
+ +

Send Webmentions

+ +
Status Date
+ + + + + + + +
URLStatus
Looking for URLs...
+ +
+ +