3 namespace BookStack\Entities\Queries;
5 use BookStack\Entities\Models\Book;
6 use BookStack\Exceptions\NotFoundException;
7 use Illuminate\Database\Eloquent\Builder;
9 class BookQueries implements ProvidesEntityQueries
11 protected static array $listAttributes = [
12 'id', 'slug', 'name', 'description', 'created_at', 'updated_at', 'image_id'
15 public function start(): Builder
20 public function findVisibleById(int $id): ?Book
22 return $this->start()->scopes('visible')->find($id);
25 public function findVisibleByIdOrFail(int $id): Book
27 return $this->start()->scopes('visible')->findOrFail($id);
30 public function findVisibleBySlugOrFail(string $slug): Book
32 /** @var ?Book $book */
33 $book = $this->start()
35 ->where('slug', '=', $slug)
39 throw new NotFoundException(trans('errors.book_not_found'));
45 public function visibleForList(): Builder
47 return $this->start()->scopes('visible')
48 ->select(static::$listAttributes);
51 public function visibleForListWithCover(): Builder
53 return $this->visibleForList()->with('cover');
56 public function recentlyViewedForCurrentUser(): Builder
58 return $this->visibleForList()
59 ->scopes('withLastView')
60 ->having('last_viewed_at', '>', 0)
61 ->orderBy('last_viewed_at', 'desc');
64 public function popularForList(): Builder
66 return $this->visibleForList()
67 ->scopes('withViewCount')
68 ->having('view_count', '>', 0)
69 ->orderBy('view_count', 'desc');