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);
70 * @return Builder<Page>
72 public function visibleForList(): Builder
76 ->select($this->mergeBookSlugForSelect(static::$listAttributes));
79 public function visibleForChapterList(int $chapterId): Builder
81 return $this->visibleForList()
82 ->where('chapter_id', '=', $chapterId)
83 ->orderBy('draft', 'desc')
84 ->orderBy('priority', 'asc');
87 public function visibleWithContents(): Builder
91 ->select($this->mergeBookSlugForSelect(static::$contentAttributes));
94 public function currentUserDraftsForList(): Builder
96 return $this->visibleForList()
97 ->where('draft', '=', true)
98 ->where('created_by', '=', user()->id);
101 public function visibleTemplates(): Builder
103 return $this->visibleForList()
104 ->where('template', '=', true);
107 protected function mergeBookSlugForSelect(array $columns): array
109 return array_merge($columns, ['book_slug' => function ($builder) {
110 $builder->select('slug')
112 ->whereColumn('books.id', '=', 'pages.book_id');