From 031c67ba58923872a1a6e8cd5bbae593b8e87377 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 10 Aug 2022 17:50:35 +0100 Subject: [PATCH] Reduced the memory usage, db queries and cache hits loading revisions Updated revision listing to only fetch required fields, massively reducing memory usage by not loading content. This also updates user avatar handling to effectively cache the avatar url within request to avoid re-searching from cache, which may improve performance of others areas of the application. This also upates handling of the revisions list view to extract table row to its own view to break things down a bit. For #3633 --- app/Auth/User.php | 10 +++ .../Controllers/PageRevisionController.php | 17 +++-- .../pages/parts/revision-table-row.blade.php | 69 +++++++++++++++++ resources/views/pages/revisions.blade.php | 76 +------------------ 4 files changed, 94 insertions(+), 78 deletions(-) create mode 100644 resources/views/pages/parts/revision-table-row.blade.php diff --git a/app/Auth/User.php b/app/Auth/User.php index c060d5ec8..393965e0d 100644 --- a/app/Auth/User.php +++ b/app/Auth/User.php @@ -80,6 +80,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon */ protected ?Collection $permissions; + /** + * This holds the user's avatar URL when loaded to prevent re-calculating within the same request. + */ + protected string $avatarUrl = ''; + /** * This holds the default user when loaded. * @@ -233,12 +238,17 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon return $default; } + if (!empty($this->avatarUrl)) { + return $this->avatarUrl; + } + try { $avatar = $this->avatar ? url($this->avatar->getThumb($size, $size, false)) : $default; } catch (Exception $err) { $avatar = $default; } + $this->avatarUrl = $avatar; return $avatar; } diff --git a/app/Http/Controllers/PageRevisionController.php b/app/Http/Controllers/PageRevisionController.php index 086518960..ea80e13cd 100644 --- a/app/Http/Controllers/PageRevisionController.php +++ b/app/Http/Controllers/PageRevisionController.php @@ -11,11 +11,8 @@ use Ssddanbrown\HtmlDiff\Diff; class PageRevisionController extends Controller { - protected $pageRepo; + protected PageRepo $pageRepo; - /** - * PageRevisionController constructor. - */ public function __construct(PageRepo $pageRepo) { $this->pageRepo = $pageRepo; @@ -29,11 +26,19 @@ class PageRevisionController extends Controller public function index(string $bookSlug, string $pageSlug) { $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); - $this->setPageTitle(trans('entities.pages_revisions_named', ['pageName'=>$page->getShortName()])); + $revisions = $page->revisions()->select([ + 'id', 'page_id', 'name', 'created_at', 'created_by', 'updated_at', + 'type', 'revision_number', 'summary', + ]) + ->selectRaw("IF(markdown = '', false, true) as is_markdown") + ->with(['page.book', 'createdBy']) + ->get(); + + $this->setPageTitle(trans('entities.pages_revisions_named', ['pageName' => $page->getShortName()])); return view('pages.revisions', [ + 'revisions' => $revisions, 'page' => $page, - 'current' => $page, ]); } diff --git a/resources/views/pages/parts/revision-table-row.blade.php b/resources/views/pages/parts/revision-table-row.blade.php new file mode 100644 index 000000000..bd891d6c4 --- /dev/null +++ b/resources/views/pages/parts/revision-table-row.blade.php @@ -0,0 +1,69 @@ + + {{ $revision->revision_number == 0 ? '' : $revision->revision_number }} + + {{ $revision->name }} +
+ ({{ $revision->is_markdown ? 'Markdown' : 'WYSIWYG' }}) + + + @if($revision->createdBy) + {{ $revision->createdBy->name }} + @endif + + + @if($revision->createdBy) {{ $revision->createdBy->name }} @else {{ trans('common.deleted_user') }} @endif +
+
+ {{ $revision->created_at->formatLocalized('%e %B %Y %H:%M:%S') }} + ({{ $revision->created_at->diffForHumans() }}) +
+ + + {{ $revision->summary }} + + + {{ trans('entities.pages_revisions_changes') }} +  |  + + + @if ($index === 0) + {{ trans('entities.pages_revisions_current') }} + @else + {{ trans('entities.pages_revisions_preview') }} +  |  + +  |  + + @endif + + \ No newline at end of file diff --git a/resources/views/pages/revisions.blade.php b/resources/views/pages/revisions.blade.php index fb9e891bb..3e7edad99 100644 --- a/resources/views/pages/revisions.blade.php +++ b/resources/views/pages/revisions.blade.php @@ -17,11 +17,11 @@

{{ trans('entities.pages_revisions') }}

- @if(count($page->revisions) > 0) + @if(count($revisions) > 0) - + @@ -29,76 +29,8 @@ - @foreach($page->revisions as $index => $revision) - - - - - - - - + @foreach($revisions as $index => $revision) + @include('pages.parts.revision-table-row', ['revision' => $revision]) @endforeach
{{ trans('entities.pages_revisions_number') }}{{ trans('entities.pages_revisions_number') }} {{ trans('entities.pages_name') }} / {{ trans('entities.pages_revisions_editor') }} {{ trans('entities.pages_revisions_changelog') }} {{ trans('common.actions') }}
{{ $revision->revision_number == 0 ? '' : $revision->revision_number }} - {{ $revision->name }} -
- ({{ $revision->markdown ? 'Markdown' : 'WYSIWYG' }}) -
- @if($revision->createdBy) - {{ $revision->createdBy->name }} - @endif - - @if($revision->createdBy) {{ $revision->createdBy->name }} @else {{ trans('common.deleted_user') }} @endif -
-
- {{ $revision->created_at->formatLocalized('%e %B %Y %H:%M:%S') }} - ({{ $revision->created_at->diffForHumans() }}) -
-
- {{ $revision->summary }} - - {{ trans('entities.pages_revisions_changes') }} -  |  - - - @if ($index === 0) - {{ trans('entities.pages_revisions_current') }} - @else - {{ trans('entities.pages_revisions_preview') }} -  |  - -  |  - - @endif -