use BookStack\Entities\Queries\EntityQueries;
use BookStack\Entities\Queries\RecentlyViewed;
use BookStack\Entities\Queries\TopFavourites;
-use BookStack\Entities\Repos\BookshelfRepo;
use BookStack\Entities\Tools\PageContent;
use BookStack\Http\Controller;
use BookStack\Uploads\FaviconHandler;
}
if ($homepageOption === 'bookshelves') {
- $shelves = app()->make(BookshelfRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
+ $shelves = $this->queries->shelves->visibleForListWithCover()
+ ->orderBy($commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder())
+ ->paginate(18);
$data = array_merge($commonData, ['shelves' => $shelves]);
return view('home.shelves', $data);
use BookStack\Activity\ActivityQueries;
use BookStack\Activity\Models\View;
use BookStack\Entities\Models\Book;
+use BookStack\Entities\Queries\BookshelfQueries;
use BookStack\Entities\Repos\BookshelfRepo;
use BookStack\Entities\Tools\ShelfContext;
use BookStack\Exceptions\ImageUploadException;
{
public function __construct(
protected BookshelfRepo $shelfRepo,
+ protected BookshelfQueries $queries,
protected ShelfContext $shelfContext,
- protected ReferenceFetcher $referenceFetcher
+ protected ReferenceFetcher $referenceFetcher,
) {
}
'updated_at' => trans('common.sort_updated_at'),
]);
- $shelves = $this->shelfRepo->getAllPaginated(18, $listOptions->getSort(), $listOptions->getOrder());
- $recents = $this->isSignedIn() ? $this->shelfRepo->getRecentlyViewed(4) : false;
- $popular = $this->shelfRepo->getPopular(4);
- $new = $this->shelfRepo->getRecentlyCreated(4);
+ $shelves = $this->queries->visibleForListWithCover()
+ ->orderBy($listOptions->getSort(), $listOptions->getOrder())
+ ->paginate(18);
+ $recents = $this->isSignedIn() ? $this->queries->recentlyViewedForCurrentUser()->get() : false;
+ $popular = $this->queries->popularForList()->get();
+ $new = $this->queries->visibleForList()
+ ->orderBy('created_at', 'desc')
+ ->take(4)
+ ->get();
$this->shelfContext->clearShelfContext();
$this->setPageTitle(trans('entities.shelves'));
*/
public function show(Request $request, ActivityQueries $activities, string $slug)
{
- $shelf = $this->shelfRepo->getBySlug($slug);
+ $shelf = $this->queries->findVisibleBySlug($slug);
$this->checkOwnablePermission('bookshelf-view', $shelf);
$listOptions = SimpleListOptions::fromRequest($request, 'shelf_books')->withSortOptions([
*/
public function edit(string $slug)
{
- $shelf = $this->shelfRepo->getBySlug($slug);
+ $shelf = $this->queries->findVisibleBySlug($slug);
$this->checkOwnablePermission('bookshelf-update', $shelf);
$shelfBookIds = $shelf->books()->get(['id'])->pluck('id');
*/
public function update(Request $request, string $slug)
{
- $shelf = $this->shelfRepo->getBySlug($slug);
+ $shelf = $this->queries->findVisibleBySlug($slug);
$this->checkOwnablePermission('bookshelf-update', $shelf);
$validated = $this->validate($request, [
'name' => ['required', 'string', 'max:255'],
*/
public function showDelete(string $slug)
{
- $shelf = $this->shelfRepo->getBySlug($slug);
+ $shelf = $this->queries->findVisibleBySlug($slug);
$this->checkOwnablePermission('bookshelf-delete', $shelf);
$this->setPageTitle(trans('entities.shelves_delete_named', ['name' => $shelf->getShortName()]));
*/
public function destroy(string $slug)
{
- $shelf = $this->shelfRepo->getBySlug($slug);
+ $shelf = $this->queries->findVisibleBySlug($slug);
$this->checkOwnablePermission('bookshelf-delete', $shelf);
$this->shelfRepo->destroy($shelf);
--- /dev/null
+<?php
+
+namespace BookStack\Entities\Queries;
+
+use BookStack\Entities\Models\Bookshelf;
+use BookStack\Exceptions\NotFoundException;
+use Illuminate\Database\Eloquent\Builder;
+
+class BookshelfQueries
+{
+ public function start(): Builder
+ {
+ return Bookshelf::query();
+ }
+
+ public function findVisibleBySlug(string $slug): Bookshelf
+ {
+ /** @var ?Bookshelf $shelf */
+ $shelf = $this->start()
+ ->scopes('visible')
+ ->where('slug', '=', $slug)
+ ->first();
+
+ if ($shelf === null) {
+ throw new NotFoundException(trans('errors.bookshelf_not_found'));
+ }
+
+ return $shelf;
+ }
+
+ public function visibleForList(): Builder
+ {
+ return $this->start()->scopes('visible');
+ }
+
+ public function visibleForListWithCover(): Builder
+ {
+ return $this->visibleForList()->with('cover');
+ }
+
+ public function recentlyViewedForCurrentUser(): Builder
+ {
+ return $this->visibleForList()
+ ->scopes('withLastView')
+ ->having('last_viewed_at', '>', 0)
+ ->orderBy('last_viewed_at', 'desc');
+ }
+
+ public function popularForList(): Builder
+ {
+ return $this->visibleForList()
+ ->scopes('withViewCount')
+ ->having('view_count', '>', 0)
+ ->orderBy('view_count', 'desc');
+ }
+}
class EntityQueries
{
public function __construct(
+ public BookshelfQueries $shelves,
public BookQueries $books,
public PageQueries $pages,
) {
use BookStack\Entities\Models\Book;
use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Tools\TrashCan;
-use BookStack\Exceptions\NotFoundException;
use BookStack\Facades\Activity;
use Exception;
-use Illuminate\Contracts\Pagination\LengthAwarePaginator;
-use Illuminate\Support\Collection;
class BookshelfRepo
{
- protected $baseRepo;
-
- /**
- * BookshelfRepo constructor.
- */
- public function __construct(BaseRepo $baseRepo)
- {
- $this->baseRepo = $baseRepo;
- }
-
- /**
- * Get all bookshelves in a paginated format.
- */
- public function getAllPaginated(int $count = 20, string $sort = 'name', string $order = 'asc'): LengthAwarePaginator
- {
- return Bookshelf::visible()
- ->with(['visibleBooks', 'cover'])
- ->orderBy($sort, $order)
- ->paginate($count);
- }
-
- /**
- * Get the bookshelves that were most recently viewed by this user.
- */
- public function getRecentlyViewed(int $count = 20): Collection
- {
- return Bookshelf::visible()->withLastView()
- ->having('last_viewed_at', '>', 0)
- ->orderBy('last_viewed_at', 'desc')
- ->take($count)->get();
- }
-
- /**
- * Get the most popular bookshelves in the system.
- */
- public function getPopular(int $count = 20): Collection
- {
- return Bookshelf::visible()->withViewCount()
- ->having('view_count', '>', 0)
- ->orderBy('view_count', 'desc')
- ->take($count)->get();
- }
-
- /**
- * Get the most recently created bookshelves from the system.
- */
- public function getRecentlyCreated(int $count = 20): Collection
- {
- return Bookshelf::visible()->orderBy('created_at', 'desc')
- ->take($count)->get();
- }
-
- /**
- * Get a shelf by its slug.
- */
- public function getBySlug(string $slug): Bookshelf
- {
- $shelf = Bookshelf::visible()->where('slug', '=', $slug)->first();
-
- if ($shelf === null) {
- throw new NotFoundException(trans('errors.bookshelf_not_found'));
- }
-
- return $shelf;
+ public function __construct(
+ protected BaseRepo $baseRepo,
+ ) {
}
/**