Skip to content

Commit ed21a6d

Browse files
committed
Queries: Updated old use-specific entity query classes
- Updated name to align, and differentate from new 'XQueries' clases. - Removed old sketchy base class with app resolving workarounds, to a proper injection-based approach. - Also fixed wrong translation text used in PageQueries.
1 parent b77ab6f commit ed21a6d

File tree

10 files changed

+57
-83
lines changed

10 files changed

+57
-83
lines changed

app/Activity/Controllers/FavouriteController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace BookStack\Activity\Controllers;
44

5-
use BookStack\Entities\Queries\TopFavourites;
5+
use BookStack\Entities\Queries\QueryTopFavourites;
66
use BookStack\Entities\Tools\MixedEntityRequestHelper;
77
use BookStack\Http\Controller;
88
use Illuminate\Http\Request;
@@ -21,7 +21,7 @@ public function index(Request $request)
2121
{
2222
$viewCount = 20;
2323
$page = intval($request->get('page', 1));
24-
$favourites = (new TopFavourites())->run($viewCount + 1, (($page - 1) * $viewCount));
24+
$favourites = (new QueryTopFavourites())->run($viewCount + 1, (($page - 1) * $viewCount));
2525

2626
$hasMoreLink = ($favourites->count() > $viewCount) ? url('/favourites?page=' . ($page + 1)) : null;
2727

app/App/HomeController.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
use BookStack\Activity\ActivityQueries;
66
use BookStack\Entities\Models\Page;
77
use BookStack\Entities\Queries\EntityQueries;
8-
use BookStack\Entities\Queries\RecentlyViewed;
9-
use BookStack\Entities\Queries\TopFavourites;
8+
use BookStack\Entities\Queries\QueryRecentlyViewed;
9+
use BookStack\Entities\Queries\QueryTopFavourites;
1010
use BookStack\Entities\Tools\PageContent;
1111
use BookStack\Http\Controller;
1212
use BookStack\Uploads\FaviconHandler;
@@ -23,8 +23,12 @@ public function __construct(
2323
/**
2424
* Display the homepage.
2525
*/
26-
public function index(Request $request, ActivityQueries $activities)
27-
{
26+
public function index(
27+
Request $request,
28+
ActivityQueries $activities,
29+
QueryRecentlyViewed $recentlyViewed,
30+
QueryTopFavourites $topFavourites,
31+
) {
2832
$activity = $activities->latest(10);
2933
$draftPages = [];
3034

@@ -38,9 +42,9 @@ public function index(Request $request, ActivityQueries $activities)
3842

3943
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
4044
$recents = $this->isSignedIn() ?
41-
(new RecentlyViewed())->run(12 * $recentFactor, 1)
45+
$recentlyViewed->run(12 * $recentFactor, 1)
4246
: $this->queries->books->visibleForList()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get();
43-
$favourites = (new TopFavourites())->run(6);
47+
$favourites = $topFavourites->run(6);
4448
$recentlyUpdatedPages = $this->queries->pages->visibleForList()
4549
->where('draft', false)
4650
->orderBy('updated_at', 'desc')

app/Entities/Queries/EntityQuery.php

Lines changed: 0 additions & 25 deletions
This file was deleted.

app/Entities/Queries/PageQueries.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public function findVisibleBySlugsOrFail(string $bookSlug, string $pageSlug): Pa
5050
->first();
5151

5252
if (is_null($page)) {
53-
throw new NotFoundException(trans('errors.chapter_not_found'));
53+
throw new NotFoundException(trans('errors.page_not_found'));
5454
}
5555

5656
return $page;
Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,32 @@
33
namespace BookStack\Entities\Queries;
44

55
use BookStack\Activity\Models\View;
6+
use BookStack\Entities\EntityProvider;
67
use BookStack\Entities\Models\BookChild;
78
use BookStack\Entities\Models\Entity;
9+
use BookStack\Permissions\PermissionApplicator;
810
use Illuminate\Database\Eloquent\Relations\BelongsTo;
911
use Illuminate\Support\Collection;
1012
use Illuminate\Support\Facades\DB;
1113

12-
class Popular extends EntityQuery
14+
class QueryPopular
1315
{
16+
public function __construct(
17+
protected PermissionApplicator $permissions,
18+
protected EntityProvider $entityProvider,
19+
) {
20+
}
21+
1422
public function run(int $count, int $page, array $filterModels = null)
1523
{
16-
$query = $this->permissionService()
24+
$query = $this->permissions
1725
->restrictEntityRelationQuery(View::query(), 'views', 'viewable_id', 'viewable_type')
1826
->select('*', 'viewable_id', 'viewable_type', DB::raw('SUM(views) as view_count'))
1927
->groupBy('viewable_id', 'viewable_type')
2028
->orderBy('view_count', 'desc');
2129

2230
if ($filterModels) {
23-
$query->whereIn('viewable_type', $this->entityProvider()->getMorphClasses($filterModels));
31+
$query->whereIn('viewable_type', $this->entityProvider->getMorphClasses($filterModels));
2432
}
2533

2634
$entities = $query->with('viewable')
@@ -35,7 +43,7 @@ public function run(int $count, int $page, array $filterModels = null)
3543
return $entities;
3644
}
3745

38-
protected function loadBooksForChildren(Collection $entities)
46+
protected function loadBooksForChildren(Collection $entities): void
3947
{
4048
$bookChildren = $entities->filter(fn(Entity $entity) => $entity instanceof BookChild);
4149
$eloquent = (new \Illuminate\Database\Eloquent\Collection($bookChildren));

app/Entities/Queries/RecentlyViewed.php renamed to app/Entities/Queries/QueryRecentlyViewed.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,26 @@
33
namespace BookStack\Entities\Queries;
44

55
use BookStack\Activity\Models\View;
6+
use BookStack\Entities\Tools\MixedEntityListLoader;
7+
use BookStack\Permissions\PermissionApplicator;
68
use Illuminate\Support\Collection;
79

8-
class RecentlyViewed extends EntityQuery
10+
class QueryRecentlyViewed
911
{
12+
public function __construct(
13+
protected PermissionApplicator $permissions,
14+
protected MixedEntityListLoader $listLoader,
15+
) {
16+
}
17+
1018
public function run(int $count, int $page): Collection
1119
{
1220
$user = user();
1321
if ($user->isGuest()) {
1422
return collect();
1523
}
1624

17-
$query = $this->permissionService()->restrictEntityRelationQuery(
25+
$query = $this->permissions->restrictEntityRelationQuery(
1826
View::query(),
1927
'views',
2028
'viewable_id',
@@ -28,7 +36,7 @@ public function run(int $count, int $page): Collection
2836
->take($count)
2937
->get();
3038

31-
$this->mixedEntityListLoader()->loadIntoRelations($views->all(), 'viewable', false);
39+
$this->listLoader->loadIntoRelations($views->all(), 'viewable', false);
3240

3341
return $views->pluck('viewable')->filter();
3442
}

app/Entities/Queries/TopFavourites.php renamed to app/Entities/Queries/QueryTopFavourites.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,26 @@
33
namespace BookStack\Entities\Queries;
44

55
use BookStack\Activity\Models\Favourite;
6+
use BookStack\Entities\Tools\MixedEntityListLoader;
7+
use BookStack\Permissions\PermissionApplicator;
68
use Illuminate\Database\Query\JoinClause;
79

8-
class TopFavourites extends EntityQuery
10+
class QueryTopFavourites
911
{
12+
public function __construct(
13+
protected PermissionApplicator $permissions,
14+
protected MixedEntityListLoader $listLoader,
15+
) {
16+
}
17+
1018
public function run(int $count, int $skip = 0)
1119
{
1220
$user = user();
1321
if ($user->isGuest()) {
1422
return collect();
1523
}
1624

17-
$query = $this->permissionService()
25+
$query = $this->permissions
1826
->restrictEntityRelationQuery(Favourite::query(), 'favourites', 'favouritable_id', 'favouritable_type')
1927
->select('favourites.*')
2028
->leftJoin('views', function (JoinClause $join) {
@@ -30,7 +38,7 @@ public function run(int $count, int $skip = 0)
3038
->take($count)
3139
->get();
3240

33-
$this->mixedEntityListLoader()->loadIntoRelations($favourites->all(), 'favouritable', false);
41+
$this->listLoader->loadIntoRelations($favourites->all(), 'favouritable', false);
3442

3543
return $favourites->pluck('favouritable')->filter();
3644
}

app/Entities/Tools/MixedEntityListLoader.php

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,13 @@
33
namespace BookStack\Entities\Tools;
44

55
use BookStack\App\Model;
6-
use BookStack\Entities\EntityProvider;
6+
use BookStack\Entities\Queries\EntityQueries;
77
use Illuminate\Database\Eloquent\Relations\Relation;
88

99
class MixedEntityListLoader
1010
{
11-
protected array $listAttributes = [
12-
'page' => ['id', 'name', 'slug', 'book_id', 'chapter_id', 'text', 'draft'],
13-
'chapter' => ['id', 'name', 'slug', 'book_id', 'description'],
14-
'book' => ['id', 'name', 'slug', 'description'],
15-
'bookshelf' => ['id', 'name', 'slug', 'description'],
16-
];
17-
1811
public function __construct(
19-
protected EntityProvider $entityProvider
12+
protected EntityQueries $queries,
2013
) {
2114
}
2215

@@ -61,14 +54,7 @@ protected function idsByTypeToModelMap(array $idsByType, bool $eagerLoadParents)
6154
$modelMap = [];
6255

6356
foreach ($idsByType as $type => $ids) {
64-
if (!isset($this->listAttributes[$type])) {
65-
continue;
66-
}
67-
68-
$instance = $this->entityProvider->get($type);
69-
$models = $instance->newQuery()
70-
->select(array_merge($this->listAttributes[$type], $this->getSubSelectsForQuery($type)))
71-
->scopes('visible')
57+
$models = $this->queries->visibleForList($type)
7258
->whereIn('id', $ids)
7359
->with($eagerLoadParents ? $this->getRelationsToEagerLoad($type) : [])
7460
->get();
@@ -100,19 +86,4 @@ protected function getRelationsToEagerLoad(string $type): array
10086

10187
return $toLoad;
10288
}
103-
104-
protected function getSubSelectsForQuery(string $type): array
105-
{
106-
$subSelects = [];
107-
108-
if ($type === 'chapter' || $type === 'page') {
109-
$subSelects['book_slug'] = function ($builder) {
110-
$builder->select('slug')
111-
->from('books')
112-
->whereColumn('books.id', '=', 'book_id');
113-
};
114-
}
115-
116-
return $subSelects;
117-
}
11889
}

app/Search/SearchController.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace BookStack\Search;
44

55
use BookStack\Entities\Queries\PageQueries;
6-
use BookStack\Entities\Queries\Popular;
6+
use BookStack\Entities\Queries\QueryPopular;
77
use BookStack\Entities\Tools\SiblingFetcher;
88
use BookStack\Http\Controller;
99
use Illuminate\Http\Request;
@@ -67,7 +67,7 @@ public function searchChapter(Request $request, int $chapterId)
6767
* Search for a list of entities and return a partial HTML response of matching entities.
6868
* Returns the most popular entities if no search is provided.
6969
*/
70-
public function searchForSelector(Request $request)
70+
public function searchForSelector(Request $request, QueryPopular $queryPopular)
7171
{
7272
$entityTypes = $request->filled('types') ? explode(',', $request->get('types')) : ['page', 'chapter', 'book'];
7373
$searchTerm = $request->get('term', false);
@@ -78,7 +78,7 @@ public function searchForSelector(Request $request)
7878
$searchTerm .= ' {type:' . implode('|', $entityTypes) . '}';
7979
$entities = $this->searchRunner->searchEntities(SearchOptions::fromString($searchTerm), 'all', 1, 20)['results'];
8080
} else {
81-
$entities = (new Popular())->run(20, 0, $entityTypes);
81+
$entities = $queryPopular->run(20, 0, $entityTypes);
8282
}
8383

8484
return view('search.parts.entity-selector-list', ['entities' => $entities, 'permission' => $permission]);

resources/views/errors/404.blade.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@extends('layouts.simple')
2-
2+
@inject('popular', \BookStack\Entities\Queries\QueryPopular::class)
33
@section('content')
44
<div class="container mt-l">
55

@@ -28,23 +28,23 @@
2828
<div class="card mb-xl">
2929
<h3 class="card-title">{{ trans('entities.pages_popular') }}</h3>
3030
<div class="px-m">
31-
@include('entities.list', ['entities' => (new \BookStack\Entities\Queries\Popular)->run(10, 0, ['page']), 'style' => 'compact'])
31+
@include('entities.list', ['entities' => $popular->run(10, 0, ['page']), 'style' => 'compact'])
3232
</div>
3333
</div>
3434
</div>
3535
<div>
3636
<div class="card mb-xl">
3737
<h3 class="card-title">{{ trans('entities.books_popular') }}</h3>
3838
<div class="px-m">
39-
@include('entities.list', ['entities' => (new \BookStack\Entities\Queries\Popular)->run(10, 0, ['book']), 'style' => 'compact'])
39+
@include('entities.list', ['entities' => $popular->run(10, 0, ['book']), 'style' => 'compact'])
4040
</div>
4141
</div>
4242
</div>
4343
<div>
4444
<div class="card mb-xl">
4545
<h3 class="card-title">{{ trans('entities.chapters_popular') }}</h3>
4646
<div class="px-m">
47-
@include('entities.list', ['entities' => (new \BookStack\Entities\Queries\Popular)->run(10, 0, ['chapter']), 'style' => 'compact'])
47+
@include('entities.list', ['entities' => $popular->run(10, 0, ['chapter']), 'style' => 'compact'])
4848
</div>
4949
</div>
5050
</div>

0 commit comments

Comments
 (0)