mirror of https://git.stjo.hn/planiverse
Code clean-up, refactoring, commenting
Did an audit of the code to tidy things up, refactor, get rid of some unused stuff that came with Laravel, and comment everything.
This commit is contained in:
parent
157b9eed48
commit
3d1747e13e
32
.env.example
32
.env.example
|
@ -1,35 +1,17 @@
|
||||||
APP_NAME=Laravel
|
APP_NAME=Planiverse
|
||||||
APP_ENV=local
|
APP_ENV=local
|
||||||
APP_KEY=
|
APP_KEY=
|
||||||
APP_DEBUG=true
|
APP_DEBUG=true
|
||||||
APP_LOG_LEVEL=debug
|
APP_LOG_LEVEL=debug
|
||||||
APP_URL=http://localhost
|
APP_URL=http://localhost
|
||||||
|
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=sqlite
|
||||||
DB_HOST=127.0.0.1
|
DB_DATABASE=/var/www/planiverse/database/database.sqlite
|
||||||
DB_PORT=3306
|
|
||||||
DB_DATABASE=homestead
|
|
||||||
DB_USERNAME=homestead
|
|
||||||
DB_PASSWORD=secret
|
|
||||||
|
|
||||||
BROADCAST_DRIVER=log
|
|
||||||
CACHE_DRIVER=file
|
|
||||||
SESSION_DRIVER=file
|
SESSION_DRIVER=file
|
||||||
SESSION_LIFETIME=120
|
SESSION_LIFETIME=1440
|
||||||
QUEUE_DRIVER=sync
|
|
||||||
|
|
||||||
REDIS_HOST=127.0.0.1
|
MASTODON_DOMAIN=http://127.0.0.1
|
||||||
REDIS_PASSWORD=null
|
MASTODON_REDIRECT=https://localhost/callback
|
||||||
REDIS_PORT=6379
|
|
||||||
|
|
||||||
MAIL_DRIVER=smtp
|
SHOW_BEATS=true
|
||||||
MAIL_HOST=smtp.mailtrap.io
|
|
||||||
MAIL_PORT=2525
|
|
||||||
MAIL_USERNAME=null
|
|
||||||
MAIL_PASSWORD=null
|
|
||||||
MAIL_ENCRYPTION=null
|
|
||||||
|
|
||||||
PUSHER_APP_ID=
|
|
||||||
PUSHER_APP_KEY=
|
|
||||||
PUSHER_APP_SECRET=
|
|
||||||
PUSHER_APP_CLUSTER=mt1
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Helpers;
|
||||||
|
|
||||||
|
use Mastodon;
|
||||||
|
use GuzzleHttp\Psr7;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container class to hold pagination links.
|
||||||
|
*/
|
||||||
|
class Links
|
||||||
|
{
|
||||||
|
public $next;
|
||||||
|
public $prev;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate pagination links for the given route.
|
||||||
|
*
|
||||||
|
* After receiving a paginated response from the Mastodon API,
|
||||||
|
* parse the "link" header from the Mastodon response and use
|
||||||
|
* it to generate next and previous links for the requested route.
|
||||||
|
*
|
||||||
|
* @param string[] $links_header An array of values of the "link" header,
|
||||||
|
* as might be returned from Guzzle's getHeader() method.
|
||||||
|
* @param string $route The name of the route to generate links for.
|
||||||
|
*/
|
||||||
|
function __construct(array $links_header, string $route)
|
||||||
|
{
|
||||||
|
foreach (Psr7\parse_header($links_header) as $link)
|
||||||
|
{
|
||||||
|
# Find the prev and next links.
|
||||||
|
if ($link['rel'] === 'prev' || $link['rel'] === 'next')
|
||||||
|
{
|
||||||
|
$url = parse_url(trim($link[0], '<>'));
|
||||||
|
foreach (explode('&', $url['query']) as $query_param)
|
||||||
|
{
|
||||||
|
# Grab the ID query parameters from the link.
|
||||||
|
if (strpos($query_param, 'max_id=') === 0
|
||||||
|
|| strpos($query_param, 'since_id=') === 0)
|
||||||
|
{
|
||||||
|
# Construct new links with the correct offset.
|
||||||
|
$this->$link['rel'] = route($route) . '?' . $query_param;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,62 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Helpers;
|
|
||||||
|
|
||||||
use Mastodon;
|
|
||||||
use GuzzleHttp\Psr7;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
|
|
||||||
class Pagination
|
|
||||||
{
|
|
||||||
public static function compile_links(string $route)
|
|
||||||
{
|
|
||||||
$links = [
|
|
||||||
'next' => null,
|
|
||||||
'prev' => null
|
|
||||||
];
|
|
||||||
|
|
||||||
# Parse out the links header returned from the Mastodon API.
|
|
||||||
$links_header = Mastodon::getResponse()->getHeader('link');
|
|
||||||
foreach (Psr7\parse_header($links_header) as $link)
|
|
||||||
{
|
|
||||||
# Find the prev and next links.
|
|
||||||
if ($link['rel'] === 'prev' || $link['rel'] === 'next')
|
|
||||||
{
|
|
||||||
$url = parse_url(trim($link[0], '<>'));
|
|
||||||
foreach (explode('&', $url['query']) as $query_param)
|
|
||||||
{
|
|
||||||
# Grab the ID query parameters from the link.
|
|
||||||
if (strpos($query_param, 'max_id=') === 0
|
|
||||||
|| strpos($query_param, 'since_id=') === 0)
|
|
||||||
{
|
|
||||||
# Construct new links with the correct offset.
|
|
||||||
$links[$link['rel']] = route($route) . '?' . $query_param;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $links;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function compile_params(Request $request)
|
|
||||||
{
|
|
||||||
$params = [];
|
|
||||||
|
|
||||||
if ($request->has('max_id') && $request->has('since_id'))
|
|
||||||
{
|
|
||||||
# This scenario makes no sense. Someone's trying to dicker with the URL.
|
|
||||||
abort(400);
|
|
||||||
}
|
|
||||||
elseif ($request->has('max_id'))
|
|
||||||
{
|
|
||||||
$params['max_id'] = $request->max_id;
|
|
||||||
}
|
|
||||||
elseif ($request->has('since_id'))
|
|
||||||
{
|
|
||||||
$params['since_id'] = $request->since_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $params;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Helpers;
|
||||||
|
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse and store pagination query parameters.
|
||||||
|
*/
|
||||||
|
class PaginationParameters
|
||||||
|
{
|
||||||
|
public $max_id;
|
||||||
|
public $since_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a Request and populate the pagination parameters from it.
|
||||||
|
*
|
||||||
|
* @param Request $request The request received with pagination query params.
|
||||||
|
*/
|
||||||
|
function __construct(Request $request)
|
||||||
|
{
|
||||||
|
if ($request->has('max_id') && $request->has('since_id'))
|
||||||
|
{
|
||||||
|
# This scenario makes no sense.
|
||||||
|
# Someone's trying to dicker with the URL.
|
||||||
|
abort(400);
|
||||||
|
}
|
||||||
|
elseif ($request->has('max_id'))
|
||||||
|
{
|
||||||
|
$this->max_id = $request->max_id;
|
||||||
|
}
|
||||||
|
elseif ($request->has('since_id'))
|
||||||
|
{
|
||||||
|
$this->since_id = $request->since_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Figure out which property is set and return it in an array.
|
||||||
|
*
|
||||||
|
* @return string[] The max_id or the since_id in an associative array.
|
||||||
|
*/
|
||||||
|
public function to_array()
|
||||||
|
{
|
||||||
|
if (isset($this->max_id))
|
||||||
|
{
|
||||||
|
return ['max_id' => $this->max_id];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return ['since_id' => $this->since_id];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,27 +6,41 @@ use App\Http\Controllers\Controller;
|
||||||
use Mastodon;
|
use Mastodon;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller for Account functions.
|
||||||
|
*/
|
||||||
class AccountController extends Controller
|
class AccountController extends Controller
|
||||||
{
|
{
|
||||||
public function view_account(Request $request, string $account_id)
|
/**
|
||||||
|
* Fetch an Account from the Mastodon API and present it to the user.
|
||||||
|
*
|
||||||
|
* The returned view will show the details of the Account and the actions
|
||||||
|
* the user can perform (follow, mute, etc.)
|
||||||
|
*
|
||||||
|
* @param string $account_id The ID of the Account to query.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View The Account details page.
|
||||||
|
*/
|
||||||
|
public function view_account(string $account_id)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
|
# Get the Account from the API.
|
||||||
$account = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$account = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->get('/accounts/' . $account_id);
|
->get('/accounts/' . $account_id);
|
||||||
|
|
||||||
if (session()->has('relationship'))
|
if (session()->has('relationship'))
|
||||||
{
|
{
|
||||||
// The user is coming here after peforming an action on an account,
|
# The user is coming here after peforming an action on an account,
|
||||||
// in which case we don't need to re-query the relationship.
|
# in which case we don't need to re-query the relationship.
|
||||||
|
|
||||||
$relationship = session('relationship');
|
$relationship = session('relationship');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If the relationship hasn't been returned from performing an action,
|
# If the relationship hasn't been returned from performing an action,
|
||||||
// we need to query for it.
|
# we need to query for it.
|
||||||
|
|
||||||
$relationships = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$relationships = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
|
@ -44,35 +58,58 @@ class AccountController extends Controller
|
||||||
return view('account', $vars);
|
return view('account', $vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function follow_account(Request $request, string $account_id)
|
/**
|
||||||
|
* Follow an Account and redirect to the "account" view.
|
||||||
|
*
|
||||||
|
* @param string $account_id The ID of the Account to query.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the account details page.
|
||||||
|
*/
|
||||||
|
public function follow_account(string $account_id)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
|
# Query the API to follow the Account.
|
||||||
$relationship = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$relationship = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->post('/accounts/' . $account_id . '/follow');
|
->post('/accounts/' . $account_id . '/follow');
|
||||||
|
|
||||||
|
# Redirect with the resulting relationship as a temporary session variable.
|
||||||
return redirect()->route('account', ['account_id' => $account_id])
|
return redirect()->route('account', ['account_id' => $account_id])
|
||||||
->with('relationship', $relationship);
|
->with('relationship', $relationship);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unfollow an Account and redirect to the "account" view.
|
||||||
|
*
|
||||||
|
* @param string $account_id The ID of the Account to query.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the account details page.
|
||||||
|
*/
|
||||||
public function unfollow_account(Request $request, string $account_id)
|
public function unfollow_account(Request $request, string $account_id)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
|
# Unfollow via the API.
|
||||||
$relationship = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$relationship = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->post('/accounts/' . $account_id . '/unfollow');
|
->post('/accounts/' . $account_id . '/unfollow');
|
||||||
|
|
||||||
|
# Redirect with the resulting relationship as a temporary session variable.
|
||||||
return redirect()->route('account', ['account_id' => $account_id])
|
return redirect()->route('account', ['account_id' => $account_id])
|
||||||
->with('relationship', $relationship);
|
->with('relationship', $relationship);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the page that lets users search for an Account.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View The search page.
|
||||||
|
*/
|
||||||
public function show_search()
|
public function show_search()
|
||||||
{
|
{
|
||||||
if (session()->has('accounts'))
|
if (session()->has('accounts'))
|
||||||
{
|
{
|
||||||
// The user is coming here after peforming a search.
|
# The user is coming here after peforming a search.
|
||||||
|
|
||||||
$accounts = session('accounts');
|
$accounts = session('accounts');
|
||||||
}
|
}
|
||||||
|
@ -89,6 +126,13 @@ class AccountController extends Controller
|
||||||
return view('search_accounts', $vars);
|
return view('search_accounts', $vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process a search request.
|
||||||
|
*
|
||||||
|
* @param Request $request The POST request with search parameters.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the search page.
|
||||||
|
*/
|
||||||
public function search(Request $request)
|
public function search(Request $request)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
@ -99,6 +143,10 @@ class AccountController extends Controller
|
||||||
abort(400);
|
abort(400);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Query the search end-point.
|
||||||
|
/* To-do: currently this always throws an exception from Guzzle.
|
||||||
|
I've commented out the nav link to the search page until I can figure
|
||||||
|
this out. */
|
||||||
$accounts = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$accounts = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->get('/accounts/search', ['q' => $request->account]);
|
->get('/accounts/search', ['q' => $request->account]);
|
||||||
|
|
|
@ -7,12 +7,25 @@ use Mastodon;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Socialite;
|
use Socialite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller for login functions.
|
||||||
|
*/
|
||||||
class LoginController extends Controller
|
class LoginController extends Controller
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Direct the user to the Mastodon OAuth login page.
|
||||||
|
*
|
||||||
|
* First check to see if we are registered as an app with the Mastodon API,
|
||||||
|
* then direct users to the OAuth login.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Http\RedirectResponse Redirect to the OAuth login.
|
||||||
|
*/
|
||||||
public function login()
|
public function login()
|
||||||
{
|
{
|
||||||
# Check if this app is already registered.
|
# Check if this app is already registered.
|
||||||
$app = DB::table('apps')->where('server', env('MASTODON_DOMAIN'))->first();
|
$app = DB::table('apps')
|
||||||
|
->where('server', env('MASTODON_DOMAIN'))
|
||||||
|
->first();
|
||||||
|
|
||||||
if ($app == null)
|
if ($app == null)
|
||||||
{
|
{
|
||||||
|
@ -28,6 +41,7 @@ class LoginController extends Controller
|
||||||
$client_id = $app_info['client_id'];
|
$client_id = $app_info['client_id'];
|
||||||
$client_secret = $app_info['client_secret'];
|
$client_secret = $app_info['client_secret'];
|
||||||
|
|
||||||
|
# Log the client details so we don't have to re-register.
|
||||||
DB::table('apps')->insert([
|
DB::table('apps')->insert([
|
||||||
'server' => env('MASTODON_DOMAIN'),
|
'server' => env('MASTODON_DOMAIN'),
|
||||||
'client_name' => env('APP_NAME'),
|
'client_name' => env('APP_NAME'),
|
||||||
|
@ -59,6 +73,14 @@ class LoginController extends Controller
|
||||||
return Socialite::driver('mastodon')->redirect();
|
return Socialite::driver('mastodon')->redirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the logged-in user.
|
||||||
|
*
|
||||||
|
* After logging in remotely, the user will be redirected to this callback.
|
||||||
|
* We juggle their login details, then direct them to the home page.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the home page.
|
||||||
|
*/
|
||||||
public function callback()
|
public function callback()
|
||||||
{
|
{
|
||||||
$domain = session('mastodon_domain');
|
$domain = session('mastodon_domain');
|
||||||
|
|
|
@ -5,15 +5,29 @@ namespace App\Http\Controllers;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Mastodon;
|
use Mastodon;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Helpers\Pagination;
|
|
||||||
|
|
||||||
|
use App\Helpers\Links;
|
||||||
|
use App\Helpers\PaginationParameters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller for the notifications page.
|
||||||
|
*/
|
||||||
class NotificationsController extends Controller
|
class NotificationsController extends Controller
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Get and display notifications.
|
||||||
|
*
|
||||||
|
* @param Request $request The request containing pagination parameters.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View The notifications page.
|
||||||
|
*/
|
||||||
public function get_notifications(Request $request)
|
public function get_notifications(Request $request)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
$params = Pagination::compile_params($request);
|
$params = (new PaginationParameters($request))
|
||||||
|
->to_array();
|
||||||
|
|
||||||
|
# Fetch notifications from the API.
|
||||||
$notifications = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$notifications = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->get('/notifications', $params);
|
->get('/notifications', $params);
|
||||||
|
@ -21,7 +35,10 @@ class NotificationsController extends Controller
|
||||||
$vars = [
|
$vars = [
|
||||||
'notifications' => $notifications,
|
'notifications' => $notifications,
|
||||||
'mastodon_domain' => explode('//', env('MASTODON_DOMAIN'))[1],
|
'mastodon_domain' => explode('//', env('MASTODON_DOMAIN'))[1],
|
||||||
'links' => Pagination::compile_links('notifications')
|
'links' => new Links(
|
||||||
|
Mastodon::getResponse()->getHeader('link'),
|
||||||
|
'notifications'
|
||||||
|
)
|
||||||
];
|
];
|
||||||
|
|
||||||
return view('notifications', $vars);
|
return view('notifications', $vars);
|
||||||
|
|
|
@ -6,27 +6,39 @@ use App\Http\Controllers\Controller;
|
||||||
use Mastodon;
|
use Mastodon;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller for managing Statuses.
|
||||||
|
*/
|
||||||
class StatusController extends Controller
|
class StatusController extends Controller
|
||||||
{
|
{
|
||||||
public function show_status(Request $request, string $status_id)
|
/**
|
||||||
|
* Show a Status.
|
||||||
|
*
|
||||||
|
* Conditionally shows a reply form if the user is logged in.
|
||||||
|
*
|
||||||
|
* @param string $status_id The ID of the Status to display.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View The Status view page.
|
||||||
|
*/
|
||||||
|
public function show_status(string $status_id)
|
||||||
{
|
{
|
||||||
if (session()->has('status'))
|
if (session()->has('status'))
|
||||||
{
|
{
|
||||||
// The user is coming here after peforming an action on a status,
|
# The user is coming here after peforming an action on a status,
|
||||||
// in which case we don't need to re-query it.
|
# in which case we don't need to re-query it.
|
||||||
|
|
||||||
$status = session('status');
|
$status = session('status');
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If the status hasn't been returned from performing an action,
|
# If the status hasn't been returned from performing an action,
|
||||||
// we need to query for it.
|
# we need to query for it.
|
||||||
|
|
||||||
if (session()->has('user'))
|
if (session()->has('user'))
|
||||||
{
|
{
|
||||||
// If the user is logged in, send the token to ensure they
|
# If the user is logged in, send the token to ensure they
|
||||||
// can see private and direct statuses. Otherwise the API
|
# can see private and direct statuses. Otherwise the API
|
||||||
// returns a 404.
|
# returns a 404.
|
||||||
|
|
||||||
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token(session('user')->token)
|
->token(session('user')->token)
|
||||||
|
@ -39,17 +51,17 @@ class StatusController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compile a list of accounts to include in the reply.
|
# Compile a list of accounts to include in the reply.
|
||||||
$reply_mentions = [];
|
$reply_mentions = [];
|
||||||
if (session()->has('user'))
|
if (session()->has('user'))
|
||||||
{
|
{
|
||||||
// Include the original poster, if not the current user.
|
# Include the original poster, if not the current user.
|
||||||
if ($status['account']['acct'] !== session('user')->user['acct'])
|
if ($status['account']['acct'] !== session('user')->user['acct'])
|
||||||
{
|
{
|
||||||
array_push($reply_mentions, '@' . $status['account']['acct']);
|
array_push($reply_mentions, '@' . $status['account']['acct']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Include all mentions, excluding the current user.
|
# Include all mentions, excluding the current user.
|
||||||
foreach ($status['mentions'] as $mention)
|
foreach ($status['mentions'] as $mention)
|
||||||
{
|
{
|
||||||
if ($mention['acct'] !== session('user')->user['acct'])
|
if ($mention['acct'] !== session('user')->user['acct'])
|
||||||
|
@ -69,10 +81,18 @@ class StatusController extends Controller
|
||||||
return view('show_status', $vars);
|
return view('show_status', $vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function reblog_status(Request $request, string $status_id)
|
/**
|
||||||
|
* Reblog a Status.
|
||||||
|
*
|
||||||
|
* @param string $status_id The ID of the Status to reblog.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the Status view page.
|
||||||
|
*/
|
||||||
|
public function reblog_status(string $status_id)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
|
# Reblog request to the API.
|
||||||
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->post('/statuses/' . $status_id . '/reblog');
|
->post('/statuses/' . $status_id . '/reblog');
|
||||||
|
@ -81,10 +101,18 @@ class StatusController extends Controller
|
||||||
->with('status', $status);
|
->with('status', $status);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function unreblog_status(Request $request, string $status_id)
|
/**
|
||||||
|
* Unreblog a Status.
|
||||||
|
*
|
||||||
|
* @param string $status_id The ID of the Status to unreblog.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the Status view page.
|
||||||
|
*/
|
||||||
|
public function unreblog_status(string $status_id)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
|
# Unreblog request to the API.
|
||||||
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->post('/statuses/' . $status_id . '/unreblog');
|
->post('/statuses/' . $status_id . '/unreblog');
|
||||||
|
@ -93,10 +121,18 @@ class StatusController extends Controller
|
||||||
->with('status', $status);
|
->with('status', $status);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function favourite_status(Request $request, string $status_id)
|
/**
|
||||||
|
* Favourite a Status.
|
||||||
|
*
|
||||||
|
* @param string $status_id The ID of the Status to favourite.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the Status view page.
|
||||||
|
*/
|
||||||
|
public function favourite_status(string $status_id)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
|
# Favourite the Status.
|
||||||
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->post('/statuses/' . $status_id . '/favourite');
|
->post('/statuses/' . $status_id . '/favourite');
|
||||||
|
@ -105,10 +141,18 @@ class StatusController extends Controller
|
||||||
->with('status', $status);
|
->with('status', $status);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function unfavourite_status(Request $request, string $status_id)
|
/**
|
||||||
|
* Unfavourite a Status.
|
||||||
|
*
|
||||||
|
* @param string $status_id The ID of the Status to unfavourite.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the Status view page.
|
||||||
|
*/
|
||||||
|
public function unfavourite_status(string $status_id)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
|
# Unfavourite request to the API.
|
||||||
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->post('/statuses/' . $status_id . '/unfavourite');
|
->post('/statuses/' . $status_id . '/unfavourite');
|
||||||
|
@ -117,6 +161,13 @@ class StatusController extends Controller
|
||||||
->with('status', $status);
|
->with('status', $status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post a new Status.
|
||||||
|
*
|
||||||
|
* @param Request $request Request containing the form submission.
|
||||||
|
*
|
||||||
|
* @return Illuminate\Routing\Redirector Redirect to the home timeline page.
|
||||||
|
*/
|
||||||
public function post_status(Request $request)
|
public function post_status(Request $request)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
@ -140,6 +191,8 @@ class StatusController extends Controller
|
||||||
'language'
|
'language'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
# Grab each of the optional inputs from the form.
|
||||||
|
# Not all of these are present in the HTML of the view yet.
|
||||||
foreach ($inputs as $input)
|
foreach ($inputs as $input)
|
||||||
{
|
{
|
||||||
if ($request->has($input))
|
if ($request->has($input))
|
||||||
|
@ -148,6 +201,7 @@ class StatusController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Post the Status via the API.
|
||||||
$new_status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$new_status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->post('/statuses', $params);
|
->post('/statuses', $params);
|
||||||
|
@ -155,11 +209,22 @@ class StatusController extends Controller
|
||||||
return redirect()->route('home');
|
return redirect()->route('home');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function context(Request $request, string $status_id)
|
/**
|
||||||
|
* Show the context of a Status.
|
||||||
|
*
|
||||||
|
* Show a Status in its thread of ancestors and descendants.
|
||||||
|
*
|
||||||
|
* @param string $status_id The ID of the Status to display.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View The context view page.
|
||||||
|
*/
|
||||||
|
public function context(string $status_id)
|
||||||
{
|
{
|
||||||
|
# Get the Status itself.
|
||||||
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$status = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->get('/statuses/' . $status_id);
|
->get('/statuses/' . $status_id);
|
||||||
|
|
||||||
|
# Get the context.
|
||||||
$context = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$context = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->get('/statuses/' . $status_id . '/context');
|
->get('/statuses/' . $status_id . '/context');
|
||||||
|
|
||||||
|
|
|
@ -5,33 +5,62 @@ namespace App\Http\Controllers;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Mastodon;
|
use Mastodon;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Helpers\Pagination;
|
|
||||||
|
|
||||||
|
use App\Helpers\Links;
|
||||||
|
use App\Helpers\PaginationParameters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controller for the public and user timelines.
|
||||||
|
*/
|
||||||
class TimelineController extends Controller
|
class TimelineController extends Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the public timeline.
|
||||||
|
*
|
||||||
|
* The user does not have to be logged in to see this.
|
||||||
|
*
|
||||||
|
* @param Request $request The request containing pagination parameters.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View The public timeline.
|
||||||
|
*/
|
||||||
public function public_timeline(Request $request)
|
public function public_timeline(Request $request)
|
||||||
{
|
{
|
||||||
$params = Pagination::compile_params($request);
|
$params = (new PaginationParameters($request))
|
||||||
|
->to_array();
|
||||||
$params['local'] = true;
|
$params['local'] = true;
|
||||||
|
|
||||||
|
# Query for the public timeline.
|
||||||
$timeline = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$timeline = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->get('/timelines/public', $params);
|
->get('/timelines/public', $params);
|
||||||
|
|
||||||
$vars = [
|
$vars = [
|
||||||
'statuses' => $timeline,
|
'statuses' => $timeline,
|
||||||
'mastodon_domain' => explode('//', env('MASTODON_DOMAIN'))[1],
|
'mastodon_domain' => explode('//', env('MASTODON_DOMAIN'))[1],
|
||||||
'links' => Pagination::compile_links('public')
|
'links' => new Links(
|
||||||
|
Mastodon::getResponse()->getHeader('link'),
|
||||||
|
'public'
|
||||||
|
)
|
||||||
];
|
];
|
||||||
|
|
||||||
return view('public_timeline', $vars);
|
return view('public_timeline', $vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the home timeline.
|
||||||
|
*
|
||||||
|
* @param Request $request The request containing pagination parameters.
|
||||||
|
*
|
||||||
|
* @return Illuminate\View\View The user's home timeline.
|
||||||
|
*/
|
||||||
public function home_timeline(Request $request)
|
public function home_timeline(Request $request)
|
||||||
{
|
{
|
||||||
$user = session('user');
|
$user = session('user');
|
||||||
|
|
||||||
$params = Pagination::compile_params($request);
|
$params = (new PaginationParameters($request))
|
||||||
|
->to_array();
|
||||||
|
|
||||||
|
# Query for the user's timeline.
|
||||||
$timeline = Mastodon::domain(env('MASTODON_DOMAIN'))
|
$timeline = Mastodon::domain(env('MASTODON_DOMAIN'))
|
||||||
->token($user->token)
|
->token($user->token)
|
||||||
->get('/timelines/home', $params);
|
->get('/timelines/home', $params);
|
||||||
|
@ -39,7 +68,10 @@ class TimelineController extends Controller
|
||||||
$vars = [
|
$vars = [
|
||||||
'statuses' => $timeline,
|
'statuses' => $timeline,
|
||||||
'mastodon_domain' => explode('//', env('MASTODON_DOMAIN'))[1],
|
'mastodon_domain' => explode('//', env('MASTODON_DOMAIN'))[1],
|
||||||
'links' => Pagination::compile_links('home')
|
'links' => new Links(
|
||||||
|
Mastodon::getResponse()->getHeader('link'),
|
||||||
|
'home'
|
||||||
|
)
|
||||||
];
|
];
|
||||||
|
|
||||||
return view('home_timeline', $vars);
|
return view('home_timeline', $vars);
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
|
|
||||||
/**
|
|
||||||
* First we will load all of this project's JavaScript dependencies which
|
|
||||||
* includes Vue and other libraries. It is a great starting point when
|
|
||||||
* building robust, powerful web applications using Vue and Laravel.
|
|
||||||
*/
|
|
||||||
|
|
||||||
require('./bootstrap');
|
|
||||||
|
|
||||||
window.Vue = require('vue');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Next, we will create a fresh Vue application instance and attach it to
|
|
||||||
* the page. Then, you may begin adding components to this application
|
|
||||||
* or customize the JavaScript scaffolding to fit your unique needs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Vue.component('example-component', require('./components/ExampleComponent.vue'));
|
|
||||||
|
|
||||||
const app = new Vue({
|
|
||||||
el: '#app'
|
|
||||||
});
|
|
|
@ -1,55 +0,0 @@
|
||||||
|
|
||||||
window._ = require('lodash');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We'll load jQuery and the Bootstrap jQuery plugin which provides support
|
|
||||||
* for JavaScript based Bootstrap features such as modals and tabs. This
|
|
||||||
* code may be modified to fit the specific needs of your application.
|
|
||||||
*/
|
|
||||||
|
|
||||||
try {
|
|
||||||
window.$ = window.jQuery = require('jquery');
|
|
||||||
|
|
||||||
require('bootstrap-sass');
|
|
||||||
} catch (e) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We'll load the axios HTTP library which allows us to easily issue requests
|
|
||||||
* to our Laravel back-end. This library automatically handles sending the
|
|
||||||
* CSRF token as a header based on the value of the "XSRF" token cookie.
|
|
||||||
*/
|
|
||||||
|
|
||||||
window.axios = require('axios');
|
|
||||||
|
|
||||||
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Next we will register the CSRF Token as a common header with Axios so that
|
|
||||||
* all outgoing HTTP requests automatically have it attached. This is just
|
|
||||||
* a simple convenience so we don't have to attach every token manually.
|
|
||||||
*/
|
|
||||||
|
|
||||||
let token = document.head.querySelector('meta[name="csrf-token"]');
|
|
||||||
|
|
||||||
if (token) {
|
|
||||||
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
|
|
||||||
} else {
|
|
||||||
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Echo exposes an expressive API for subscribing to channels and listening
|
|
||||||
* for events that are broadcast by Laravel. Echo and event broadcasting
|
|
||||||
* allows your team to easily build robust real-time web applications.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// import Echo from 'laravel-echo'
|
|
||||||
|
|
||||||
// window.Pusher = require('pusher-js');
|
|
||||||
|
|
||||||
// window.Echo = new Echo({
|
|
||||||
// broadcaster: 'pusher',
|
|
||||||
// key: 'your-pusher-key',
|
|
||||||
// cluster: 'mt1',
|
|
||||||
// encrypted: true
|
|
||||||
// });
|
|
|
@ -1,23 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-8 col-md-offset-2">
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">Example Component</div>
|
|
||||||
|
|
||||||
<div class="panel-body">
|
|
||||||
I'm an example component!
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
mounted() {
|
|
||||||
console.log('Component mounted.')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
|
@ -1,38 +0,0 @@
|
||||||
|
|
||||||
// Body
|
|
||||||
$body-bg: #f5f8fa;
|
|
||||||
|
|
||||||
// Borders
|
|
||||||
$laravel-border-color: darken($body-bg, 10%);
|
|
||||||
$list-group-border: $laravel-border-color;
|
|
||||||
$navbar-default-border: $laravel-border-color;
|
|
||||||
$panel-default-border: $laravel-border-color;
|
|
||||||
$panel-inner-border: $laravel-border-color;
|
|
||||||
|
|
||||||
// Brands
|
|
||||||
$brand-primary: #3097D1;
|
|
||||||
$brand-info: #8eb4cb;
|
|
||||||
$brand-success: #2ab27b;
|
|
||||||
$brand-warning: #cbb956;
|
|
||||||
$brand-danger: #bf5329;
|
|
||||||
|
|
||||||
// Typography
|
|
||||||
$icon-font-path: "~bootstrap-sass/assets/fonts/bootstrap/";
|
|
||||||
$font-family-sans-serif: "Raleway", sans-serif;
|
|
||||||
$font-size-base: 14px;
|
|
||||||
$line-height-base: 1.6;
|
|
||||||
$text-color: #636b6f;
|
|
||||||
|
|
||||||
// Navbar
|
|
||||||
$navbar-default-bg: #fff;
|
|
||||||
|
|
||||||
// Buttons
|
|
||||||
$btn-default-color: $text-color;
|
|
||||||
|
|
||||||
// Inputs
|
|
||||||
$input-border: lighten($text-color, 40%);
|
|
||||||
$input-border-focus: lighten($brand-primary, 25%);
|
|
||||||
$input-color-placeholder: lighten($text-color, 30%);
|
|
||||||
|
|
||||||
// Panels
|
|
||||||
$panel-default-heading-bg: #fff;
|
|
|
@ -1,9 +0,0 @@
|
||||||
|
|
||||||
// Fonts
|
|
||||||
@import url("https://fonts.googleapis.com/css?family=Raleway:300,400,600");
|
|
||||||
|
|
||||||
// Variables
|
|
||||||
@import "variables";
|
|
||||||
|
|
||||||
// Bootstrap
|
|
||||||
@import "~bootstrap-sass/assets/stylesheets/bootstrap";
|
|
|
@ -1,11 +1,11 @@
|
||||||
<nav>
|
<nav>
|
||||||
<ul>
|
<ul>
|
||||||
@if ($links['prev'] !== null)
|
@if (isset($links->prev))
|
||||||
<li><a href="{{ $links['prev'] }}">Previous</a></li>
|
<li><a href="{{ $links->prev }}">Previous</a></li>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if ($links['next'] !== null)
|
@if (isset($links->next))
|
||||||
<li><a href="{{ $links['next'] }}">Next</a></li>
|
<li><a href="{{ $links->next }}">Next</a></li>
|
||||||
@endif
|
@endif
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
@ -24,22 +24,22 @@
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<!-- Context -->
|
<!-- Context -->
|
||||||
<span title="Expand thread">
|
<span title="Expand thread">
|
||||||
<a href="{{ route('thread', ['id' => $status['id']]) }}">⥈</a>
|
<a href="{{ route('thread', ['status_id' => $status['id']]) }}">⥈</a>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<!-- Reply -->
|
<!-- Reply -->
|
||||||
<span title="Reply">
|
<span title="Reply">
|
||||||
<a href="{{ route('status', ['id' => $status['id']]) }}">↵</a>
|
<a href="{{ route('status', ['status_id' => $status['id']]) }}">↵</a>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<!-- Reblog -->
|
<!-- Reblog -->
|
||||||
<span title="Reblog">
|
<span title="Reblog">
|
||||||
@if ($status['reblogged'])
|
@if ($status['reblogged'])
|
||||||
<span class="reblogged">
|
<span class="reblogged">
|
||||||
<a href="{{ route('unreblog', ['id' => $status['id']]) }}">↺</a>
|
<a href="{{ route('unreblog', ['status_id' => $status['id']]) }}">↺</a>
|
||||||
</span>
|
</span>
|
||||||
@else
|
@else
|
||||||
<a href="{{ route('reblog', ['id' => $status['id']]) }}">↺</a>
|
<a href="{{ route('reblog', ['status_id' => $status['id']]) }}">↺</a>
|
||||||
@endif
|
@endif
|
||||||
{{ $status['reblogs_count'] }}
|
{{ $status['reblogs_count'] }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -48,10 +48,10 @@
|
||||||
<span title="Favourite">
|
<span title="Favourite">
|
||||||
@if ($status['favourited'])
|
@if ($status['favourited'])
|
||||||
<span class="favourited">
|
<span class="favourited">
|
||||||
<a href="{{ route('unfavourite', ['id' => $status['id']]) }}">★</a>
|
<a href="{{ route('unfavourite', ['status_id' => $status['id']]) }}">★</a>
|
||||||
</span>
|
</span>
|
||||||
@else
|
@else
|
||||||
<a href="{{ route('favourite', ['id' => $status['id']]) }}">☆</a>
|
<a href="{{ route('favourite', ['status_id' => $status['id']]) }}">☆</a>
|
||||||
@endif
|
@endif
|
||||||
{{ $status['favourites_count'] }}
|
{{ $status['favourites_count'] }}
|
||||||
</span>
|
</span>
|
||||||
|
|
Loading…
Reference in New Issue