+ /** @var ?Page $page */
+ $page = $this->start()->with('book')
+ ->scopes('visible')
+ ->whereHas('book', function (Builder $query) use ($bookSlug) {
+ $query->where('slug', '=', $bookSlug);
+ })
+ ->where('slug', '=', $pageSlug)
+ ->first();
+
+ if (is_null($page)) {
+ throw new NotFoundException(trans('errors.page_not_found'));
+ }
+
+ return $page;
+ }
+
+ public function usingSlugs(string $bookSlug, string $pageSlug): Builder
+ {
+ return $this->start()
+ ->where('slug', '=', $pageSlug)
+ ->whereHas('book', function (Builder $query) use ($bookSlug) {
+ $query->where('slug', '=', $bookSlug);
+ });
+ }
+
+ public function visibleForList(): Builder
+ {
+ return $this->start()
+ ->scopes('visible')
+ ->select($this->mergeBookSlugForSelect(static::$listAttributes));
+ }
+
+ public function visibleForChapterList(int $chapterId): Builder
+ {
+ return $this->visibleForList()
+ ->where('chapter_id', '=', $chapterId)
+ ->orderBy('draft', 'desc')
+ ->orderBy('priority', 'asc');
+ }
+
+ public function visibleWithContents(): Builder
+ {
+ return $this->start()
+ ->scopes('visible')
+ ->select($this->mergeBookSlugForSelect(static::$contentAttributes));
+ }
+
+ public function currentUserDraftsForList(): Builder
+ {
+ return $this->visibleForList()