Merge pull request #886 from pixelfed/frontend-ui-refactor

Frontend ui refactor
This commit is contained in:
daniel 2019-02-25 14:26:10 -07:00 committed by GitHub
commit 2e83ac9063
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 39 additions and 36 deletions

View file

@ -36,16 +36,16 @@ trait AdminSettingsController
public function settingsStorage(Request $request) public function settingsStorage(Request $request)
{ {
$databaseSum = Cache::remember('admin:settings:storage:db:storageUsed', 360, function() { $databaseSum = Cache::remember('admin:settings:storage:db:storageUsed', now()->addMinutes(360), function() {
$q = 'SELECT sum(ROUND(((data_length + index_length)), 0)) AS size FROM information_schema.TABLES WHERE table_schema = ?'; $q = 'SELECT sum(ROUND(((data_length + index_length)), 0)) AS size FROM information_schema.TABLES WHERE table_schema = ?';
$db = config('database.default'); $db = config('database.default');
$db = config("database.connections.{$db}.database"); $db = config("database.connections.{$db}.database");
return DB::select($q, [$db])[0]->size; return DB::select($q, [$db])[0]->size;
}); });
$mediaSum = Cache::remember('admin:settings:storage:media:storageUsed', 360, function() { $mediaSum = Cache::remember('admin:settings:storage:media:storageUsed', now()->addMinutes(360), function() {
return Media::sum('size'); return Media::sum('size');
}); });
$backupSum = Cache::remember('admin:settings:storage:backups:storageUsed', 360, function() { $backupSum = Cache::remember('admin:settings:storage:backups:storageUsed', now()->addMinutes(360), function() {
$dir = storage_path('app/'.config('app.name')); $dir = storage_path('app/'.config('app.name'));
$size = 0; $size = 0;
foreach (glob(rtrim($dir, '/').'/*', GLOB_NOSORT) as $each) { foreach (glob(rtrim($dir, '/').'/*', GLOB_NOSORT) as $each) {

View file

@ -44,7 +44,7 @@ class AdminController extends Controller
public function home() public function home()
{ {
$data = Cache::remember('admin:dashboard:home:data', 15, function() { $data = Cache::remember('admin:dashboard:home:data', now()->addMinutes(15), function() {
$day = config('database.default') == 'pgsql' ? 'DATE_PART(\'day\',' : 'day('; $day = config('database.default') == 'pgsql' ? 'DATE_PART(\'day\',' : 'day(';
return [ return [
'failedjobs' => [ 'failedjobs' => [

View file

@ -57,7 +57,7 @@ class BaseApiController extends Controller
{ {
$pid = Auth::user()->profile->id; $pid = Auth::user()->profile->id;
$page = $request->input('page') ?? 1; $page = $request->input('page') ?? 1;
$res = Cache::remember('profile:notifications:'.$pid.':page:'.$page, 5, function() use($pid) { $res = Cache::remember('profile:notifications:'.$pid.':page:'.$page, now()->addMinutes(5), function() use($pid) {
$timeago = Carbon::now()->subMonths(6); $timeago = Carbon::now()->subMonths(6);
$notifications = Notification::whereHas('actor') $notifications = Notification::whereHas('actor')
->whereProfileId($pid) ->whereProfileId($pid)

View file

@ -11,7 +11,7 @@ class InstanceApiController extends Controller {
protected function getData() protected function getData()
{ {
$contact = Cache::remember('api:v1:instance:contact', 1440, function() { $contact = Cache::remember('api:v1:instance:contact', now()->addMinutes(1440), function() {
$admin = User::whereIsAdmin(true)->first()->profile; $admin = User::whereIsAdmin(true)->first()->profile;
return [ return [
'id' => $admin->id, 'id' => $admin->id,
@ -56,7 +56,7 @@ class InstanceApiController extends Controller {
public function instance() public function instance()
{ {
$res = Cache::remember('api:v1:instance', 60, function() { $res = Cache::remember('api:v1:instance', now()->addMinutes(60), function() {
return json_encode($this->getData()); return json_encode($this->getData());
}); });

View file

@ -10,6 +10,7 @@ use Illuminate\Http\Request;
class ApiController extends BaseApiController class ApiController extends BaseApiController
{ {
// todo: deprecate and remove
public function hydrateLikes(Request $request) public function hydrateLikes(Request $request)
{ {
$this->validate($request, [ $this->validate($request, [
@ -18,7 +19,7 @@ class ApiController extends BaseApiController
]); ]);
$profile = Auth::user()->profile; $profile = Auth::user()->profile;
$res = Cache::remember('api:like-ids:user:'.$profile->id, 1440, function () use ($profile) { $res = Cache::remember('api:like-ids:user:'.$profile->id, now()->addDays(1), function () use ($profile) {
return Like::whereProfileId($profile->id) return Like::whereProfileId($profile->id)
->orderBy('id', 'desc') ->orderBy('id', 'desc')
->take(1000) ->take(1000)

View file

@ -80,7 +80,7 @@ class FederationController extends Controller
public function nodeinfo() public function nodeinfo()
{ {
$res = Cache::remember('api:nodeinfo', 60, function () { $res = Cache::remember('api:nodeinfo', now()->addHours(1), function () {
return [ return [
'metadata' => [ 'metadata' => [
'nodeName' => config('app.name'), 'nodeName' => config('app.name'),

View file

@ -105,10 +105,10 @@ class InternalApiController extends Controller
{ {
$profile = Auth::user()->profile; $profile = Auth::user()->profile;
$pid = $profile->id; $pid = $profile->id;
$following = Cache::remember('feature:discover:following:'.$pid, 60, function() use ($pid) { $following = Cache::remember('feature:discover:following:'.$pid, now()->addMinutes(60), function() use ($pid) {
return Follower::whereProfileId($pid)->pluck('following_id')->toArray(); return Follower::whereProfileId($pid)->pluck('following_id')->toArray();
}); });
$filters = Cache::remember("user:filter:list:$pid", 60, function() use($pid) { $filters = Cache::remember("user:filter:list:$pid", now()->addMinutes(60), function() use($pid) {
return UserFilter::whereUserId($pid) return UserFilter::whereUserId($pid)
->whereFilterableType('App\Profile') ->whereFilterableType('App\Profile')
->whereIn('filter_type', ['mute', 'block']) ->whereIn('filter_type', ['mute', 'block'])
@ -161,10 +161,10 @@ class InternalApiController extends Controller
{ {
$profile = Auth::user()->profile; $profile = Auth::user()->profile;
$pid = $profile->id; $pid = $profile->id;
$following = Cache::remember('feature:discover:following:'.$pid, 60, function() use ($pid) { $following = Cache::remember('feature:discover:following:'.$pid, now()->addMinutes(60), function() use ($pid) {
return Follower::whereProfileId($pid)->pluck('following_id')->toArray(); return Follower::whereProfileId($pid)->pluck('following_id')->toArray();
}); });
$filters = Cache::remember("user:filter:list:$pid", 60, function() use($pid) { $filters = Cache::remember("user:filter:list:$pid", now()->addMinutes(60), function() use($pid) {
return UserFilter::whereUserId($pid) return UserFilter::whereUserId($pid)
->whereFilterableType('App\Profile') ->whereFilterableType('App\Profile')
->whereIn('filter_type', ['mute', 'block']) ->whereIn('filter_type', ['mute', 'block'])
@ -200,10 +200,10 @@ class InternalApiController extends Controller
{ {
$profile = Auth::user()->profile; $profile = Auth::user()->profile;
$pid = $profile->id; $pid = $profile->id;
$following = Cache::remember('feature:discover:following:'.$pid, 15, function() use ($pid) { $following = Cache::remember('feature:discover:following:'.$pid, now()->addMinutes(15), function() use ($pid) {
return Follower::whereProfileId($pid)->pluck('following_id')->toArray(); return Follower::whereProfileId($pid)->pluck('following_id')->toArray();
}); });
$filters = Cache::remember("user:filter:list:$pid", 15, function() use($pid) { $filters = Cache::remember("user:filter:list:$pid", now()->addMinutes(15), function() use($pid) {
$private = Profile::whereIsPrivate(true) $private = Profile::whereIsPrivate(true)
->orWhere('unlisted', true) ->orWhere('unlisted', true)
->orWhere('status', '!=', null) ->orWhere('status', '!=', null)

View file

@ -48,7 +48,7 @@ class LikeController extends Controller
->take(1000) ->take(1000)
->pluck('status_id'); ->pluck('status_id');
Cache::put('api:like-ids:user:'.$profile->id, $likes, 1440); Cache::put('api:like-ids:user:'.$profile->id, $likes, now()->addMinutes(1440));
if ($request->ajax()) { if ($request->ajax()) {
$response = ['code' => 200, 'msg' => 'Like saved', 'count' => $count]; $response = ['code' => 200, 'msg' => 'Like saved', 'count' => $count];

View file

@ -223,7 +223,7 @@ class PublicApiController extends Controller
// $timeline = Timeline::build()->local(); // $timeline = Timeline::build()->local();
$pid = Auth::user()->profile->id; $pid = Auth::user()->profile->id;
$private = Cache::remember('profiles:private', 1440, function() { $private = Cache::remember('profiles:private', now()->addMinutes(1440), function() {
return Profile::whereIsPrivate(true) return Profile::whereIsPrivate(true)
->orWhere('unlisted', true) ->orWhere('unlisted', true)
->orWhere('status', '!=', null) ->orWhere('status', '!=', null)
@ -317,7 +317,7 @@ class PublicApiController extends Controller
// $timeline = Timeline::build()->local(); // $timeline = Timeline::build()->local();
$pid = Auth::user()->profile->id; $pid = Auth::user()->profile->id;
$following = Cache::remember('profile:following:'.$pid, 1440, function() use($pid) { $following = Cache::remember('profile:following:'.$pid, now()->addMinutes(1440), function() use($pid) {
$following = Follower::whereProfileId($pid)->pluck('following_id'); $following = Follower::whereProfileId($pid)->pluck('following_id');
return $following->push($pid)->toArray(); return $following->push($pid)->toArray();
}); });

View file

@ -23,7 +23,7 @@ class SearchController extends Controller
return; return;
} }
$hash = hash('sha256', $tag); $hash = hash('sha256', $tag);
$tokens = Cache::remember('api:search:tag:'.$hash, 5, function () use ($tag) { $tokens = Cache::remember('api:search:tag:'.$hash, now()->addMinutes(5), function () use ($tag) {
$tokens = collect([]); $tokens = collect([]);
if(Helpers::validateUrl($tag)) { if(Helpers::validateUrl($tag)) {
$remote = Helpers::fetchFromUrl($tag); $remote = Helpers::fetchFromUrl($tag);
@ -85,6 +85,7 @@ class SearchController extends Controller
'value' => $item->username, 'value' => $item->username,
'tokens' => [$item->username], 'tokens' => [$item->username],
'name' => $item->name, 'name' => $item->name,
'id' => $item->id
]; ];
}); });
$tokens->push($profiles); $tokens->push($profiles);

View file

@ -74,7 +74,7 @@ class SettingsController extends Controller
public function exportFollowing() public function exportFollowing()
{ {
$data = Cache::remember('account:export:profile:following:'.Auth::user()->profile->id, 1440, function() { $data = Cache::remember('account:export:profile:following:'.Auth::user()->profile->id, now()->addMinutes(1440), function() {
return Auth::user()->profile->following()->get()->map(function($i) { return Auth::user()->profile->following()->get()->map(function($i) {
return $i->url(); return $i->url();
}); });
@ -86,7 +86,7 @@ class SettingsController extends Controller
public function exportFollowers() public function exportFollowers()
{ {
$data = Cache::remember('account:export:profile:followers:'.Auth::user()->profile->id, 1440, function() { $data = Cache::remember('account:export:profile:followers:'.Auth::user()->profile->id, now()->addMinutes(1440), function() {
return Auth::user()->profile->followers()->get()->map(function($i) { return Auth::user()->profile->followers()->get()->map(function($i) {
return $i->url(); return $i->url();
}); });
@ -105,7 +105,7 @@ class SettingsController extends Controller
if(!$exists) { if(!$exists) {
return redirect()->back(); return redirect()->back();
} }
$data = Cache::remember('account:export:profile:muteblocklist:'.Auth::user()->profile->id, 1440, function() use($profile) { $data = Cache::remember('account:export:profile:muteblocklist:'.Auth::user()->profile->id, now()->addMinutes(1440), function() use($profile) {
return json_encode([ return json_encode([
'muted' => $profile->mutedProfileUrls(), 'muted' => $profile->mutedProfileUrls(),
'blocked' => $profile->blockedProfileUrls() 'blocked' => $profile->blockedProfileUrls()

View file

@ -41,10 +41,10 @@ class SiteController extends Controller
public function about() public function about()
{ {
$res = Cache::remember('site:about', 120, function() { $res = Cache::remember('site:about', now()->addMinutes(120), function() {
$custom = Page::whereSlug('/site/about')->whereActive(true)->exists(); $custom = Page::whereSlug('/site/about')->whereActive(true)->exists();
if($custom) { if($custom) {
$stats = Cache::remember('site:about:stats', 60, function() { $stats = Cache::remember('site:about:stats', now()->addMinutes(60), function() {
return [ return [
'posts' => Status::whereLocal(true)->count(), 'posts' => Status::whereLocal(true)->count(),
'users' => User::count(), 'users' => User::count(),
@ -53,7 +53,7 @@ class SiteController extends Controller
}); });
return View::make('site.about')->with('stats', $stats)->render(); return View::make('site.about')->with('stats', $stats)->render();
} else { } else {
$stats = Cache::remember('site:about:stats', 60, function() { $stats = Cache::remember('site:about:stats', now()->addMinutes(60), function() {
return [ return [
'posts' => Status::whereLocal(true)->count(), 'posts' => Status::whereLocal(true)->count(),
'users' => User::count(), 'users' => User::count(),

View file

@ -124,7 +124,7 @@ class Profile extends Model
public function avatarUrl() public function avatarUrl()
{ {
$url = Cache::remember("avatar:{$this->id}", 1440, function () { $url = Cache::remember("avatar:{$this->id}", now()->addDays(1), function () {
$path = optional($this->avatar)->media_path; $path = optional($this->avatar)->media_path;
$version = hash('sha1', $this->avatar->updated_at); $version = hash('sha1', $this->avatar->updated_at);
$path = "{$path}?v={$version}"; $path = "{$path}?v={$version}";

View file

@ -2,11 +2,10 @@
namespace App; namespace App;
use Auth, Cache; use Auth, Cache, Hashids, Storage;
use App\Http\Controllers\StatusController; use App\Http\Controllers\StatusController;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Storage;
class Status extends Model class Status extends Model
{ {
@ -77,7 +76,7 @@ class Status extends Model
public function thumb($showNsfw = false) public function thumb($showNsfw = false)
{ {
return Cache::remember('status:thumb:'.$this->id, 40320, function() use ($showNsfw) { return Cache::remember('status:thumb:'.$this->id, now()->addMinutes(15), function() use ($showNsfw) {
$type = $this->type ?? $this->setType(); $type = $this->type ?? $this->setType();
$is_nsfw = !$showNsfw ? $this->is_nsfw : false; $is_nsfw = !$showNsfw ? $this->is_nsfw : false;
if ($this->media->count() == 0 || $is_nsfw || !in_array($type,['photo', 'photo:album'])) { if ($this->media->count() == 0 || $is_nsfw || !in_array($type,['photo', 'photo:album'])) {

View file

@ -62,7 +62,7 @@ class StatusTransformer extends Fractal\TransformerAbstract
public function includeMediaAttachments(Status $status) public function includeMediaAttachments(Status $status)
{ {
return Cache::remember('status:transformer:media:attachments:'.$status->id, 1440, function() use($status) { return Cache::remember('status:transformer:media:attachments:'.$status->id, now()->addMinutes(1440), function() use($status) {
$media = $status->media()->orderBy('order')->get(); $media = $status->media()->orderBy('order')->get();
return $this->collection($media, new MediaTransformer()); return $this->collection($media, new MediaTransformer());
}); });

View file

@ -30,7 +30,7 @@ class Helpers {
public static function validateObject($data) public static function validateObject($data)
{ {
// todo: undo // todo: undo
$verbs = ['Create', 'Announce', 'Like', 'Follow', 'Delete', 'Accept', 'Reject']; $verbs = ['Create', 'Announce', 'Like', 'Follow', 'Delete', 'Accept', 'Reject', 'Undo'];
$valid = Validator::make($data, [ $valid = Validator::make($data, [
'type' => [ 'type' => [
@ -136,7 +136,7 @@ class Helpers {
'127.0.0.1', 'localhost', '::1' '127.0.0.1', 'localhost', '::1'
]; ];
$valid = filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED|FILTER_FLAG_HOST_REQUIRED); $valid = filter_var($url, FILTER_VALIDATE_URL);
if(in_array(parse_url($valid, PHP_URL_HOST), $localhosts)) { if(in_array(parse_url($valid, PHP_URL_HOST), $localhosts)) {
return false; return false;
@ -232,8 +232,8 @@ class Helpers {
$ts = is_array($res['published']) ? $res['published'][0] : $res['published']; $ts = is_array($res['published']) ? $res['published'][0] : $res['published'];
$status = new Status; $status = new Status;
$status->profile_id = $profile->id; $status->profile_id = $profile->id;
$status->url = $url; $status->url = isset($res['url']) ? $res['url'] : $url;
$status->uri = $url; $status->uri = isset($res['url']) ? $res['url'] : $url;
$status->caption = strip_tags($res['content']); $status->caption = strip_tags($res['content']);
$status->rendered = Purify::clean($res['content']); $status->rendered = Purify::clean($res['content']);
$status->created_at = Carbon::parse($ts); $status->created_at = Carbon::parse($ts);

View file

@ -108,7 +108,8 @@ class HttpSignature {
'(request-target)' => 'post '.parse_url($url, PHP_URL_PATH), '(request-target)' => 'post '.parse_url($url, PHP_URL_PATH),
'Date' => $date->format('D, d M Y H:i:s \G\M\T'), 'Date' => $date->format('D, d M Y H:i:s \G\M\T'),
'Host' => parse_url($url, PHP_URL_HOST), 'Host' => parse_url($url, PHP_URL_HOST),
'Content-Type' => 'application/activity+json', 'Accept' => 'application/activity+json, application/json',
'Content-Type' => 'application/activity+json'
]; ];
if($digest) { if($digest) {

View file

@ -4,7 +4,7 @@ namespace App\Util\Media;
use App\Media; use App\Media;
use Image as Intervention; use Image as Intervention;
use Storage; use Cache, Storage;
class Image class Image
{ {
@ -141,6 +141,7 @@ class Image
} }
$media->save(); $media->save();
Cache::forget('status:thumb:'.$media->status_id);
} catch (Exception $e) { } catch (Exception $e) {
} }
} }