3 namespace BookStack\Entities\Queries;
5 use BookStack\Entities\Models\Page;
6 use BookStack\Exceptions\NotFoundException;
7 use Illuminate\Database\Eloquent\Builder;
9 class PageQueries implements ProvidesEntityQueries
11 protected static array $contentAttributes = [
12 'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft',
13 'template', 'html', 'text', 'created_at', 'updated_at', 'priority'
15 protected static array $listAttributes = [
16 'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft',
17 'template', 'text', 'created_at', 'updated_at', 'priority'
20 public function start(): Builder
25 public function findVisibleById(int $id): ?Page
27 return $this->start()->scopes('visible')->find($id);
30 public function findVisibleByIdOrFail(int $id): Page
32 $page = $this->findVisibleById($id);
35 throw new NotFoundException(trans('errors.page_not_found'));
41 public function findVisibleBySlugsOrFail(string $bookSlug, string $pageSlug): Page
43 /** @var ?Page $page */
44 $page = $this->start()->with('book')
46 ->whereHas('book', function (Builder $query) use ($bookSlug) {
47 $query->where('slug', '=', $bookSlug);
49 ->where('slug', '=', $pageSlug)
53 throw new NotFoundException(trans('errors.page_not_found'));
59 public function usingSlugs(string $bookSlug, string $pageSlug): Builder
62 ->where('slug', '=', $pageSlug)
63 ->whereHas('book', function (Builder $query) use ($bookSlug) {
64 $query->where('slug', '=', $bookSlug);
68 public function visibleForList(): Builder
72 ->select($this->mergeBookSlugForSelect(static::$listAttributes));
75 public function visibleWithContents(): Builder
79 ->select($this->mergeBookSlugForSelect(static::$contentAttributes));
82 public function currentUserDraftsForList(): Builder
84 return $this->visibleForList()
85 ->where('draft', '=', true)
86 ->where('created_by', '=', user()->id);
89 public function visibleTemplates(): Builder
91 return $this->visibleForList()
92 ->where('template', '=', true);
95 protected function mergeBookSlugForSelect(array $columns): array
97 return array_merge($columns, ['book_slug' => function ($builder) {
98 $builder->select('slug')
100 ->whereColumn('books.id', '=', 'pages.book_id');