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',
14 'created_by', 'updated_by', 'owned_by',
16 protected static array $listAttributes = [
17 'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft',
18 'template', 'text', 'created_at', 'updated_at', 'priority', 'owned_by',
21 public function start(): Builder
26 public function findVisibleById(int $id): ?Page
28 return $this->start()->scopes('visible')->find($id);
31 public function findVisibleByIdOrFail(int $id): Page
33 $page = $this->findVisibleById($id);
36 throw new NotFoundException(trans('errors.page_not_found'));
42 public function findVisibleBySlugsOrFail(string $bookSlug, string $pageSlug): Page
44 /** @var ?Page $page */
45 $page = $this->start()->with('book')
47 ->whereHas('book', function (Builder $query) use ($bookSlug) {
48 $query->where('slug', '=', $bookSlug);
50 ->where('slug', '=', $pageSlug)
54 throw new NotFoundException(trans('errors.page_not_found'));
60 public function usingSlugs(string $bookSlug, string $pageSlug): Builder
63 ->where('slug', '=', $pageSlug)
64 ->whereHas('book', function (Builder $query) use ($bookSlug) {
65 $query->where('slug', '=', $bookSlug);
69 public function visibleForList(): Builder
73 ->select($this->mergeBookSlugForSelect(static::$listAttributes));
76 public function visibleForChapterList(int $chapterId): Builder
78 return $this->visibleForList()
79 ->where('chapter_id', '=', $chapterId)
80 ->orderBy('draft', 'desc')
81 ->orderBy('priority', 'asc');
84 public function visibleWithContents(): Builder
88 ->select($this->mergeBookSlugForSelect(static::$contentAttributes));
91 public function currentUserDraftsForList(): Builder
93 return $this->visibleForList()
94 ->where('draft', '=', true)
95 ->where('created_by', '=', user()->id);
98 public function visibleTemplates(): Builder
100 return $this->visibleForList()
101 ->where('template', '=', true);
104 protected function mergeBookSlugForSelect(array $columns): array
106 return array_merge($columns, ['book_slug' => function ($builder) {
107 $builder->select('slug')
109 ->whereColumn('books.id', '=', 'pages.book_id');