| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Queries; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  | use BookStack\Exceptions\NotFoundException; | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Builder; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  | class PageQueries implements ProvidesEntityQueries | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-02-08 06:41:45 +08:00
										 |  |  |     protected static array $contentAttributes = [ | 
					
						
							|  |  |  |         'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft', | 
					
						
							| 
									
										
										
										
											2024-02-09 01:18:03 +08:00
										 |  |  |         'template', 'html', 'text', 'created_at', 'updated_at', 'priority', | 
					
						
							|  |  |  |         'created_by', 'updated_by', 'owned_by', | 
					
						
							| 
									
										
										
										
											2024-02-08 06:41:45 +08:00
										 |  |  |     ]; | 
					
						
							|  |  |  |     protected static array $listAttributes = [ | 
					
						
							|  |  |  |         'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft', | 
					
						
							| 
									
										
										
										
											2024-02-09 01:18:03 +08:00
										 |  |  |         'template', 'text', 'created_at', 'updated_at', 'priority', 'owned_by', | 
					
						
							| 
									
										
										
										
											2024-02-08 06:41:45 +08:00
										 |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |     public function start(): Builder | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         return Page::query(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |     public function findVisibleById(int $id): ?Page | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->start()->scopes('visible')->find($id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |     public function findVisibleByIdOrFail(int $id): Page | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = $this->findVisibleById($id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (is_null($page)) { | 
					
						
							|  |  |  |             throw new NotFoundException(trans('errors.page_not_found')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function findVisibleBySlugsOrFail(string $bookSlug, string $pageSlug): Page | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var ?Page $page */ | 
					
						
							|  |  |  |         $page = $this->start()->with('book') | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |             ->scopes('visible') | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |             ->whereHas('book', function (Builder $query) use ($bookSlug) { | 
					
						
							|  |  |  |                 $query->where('slug', '=', $bookSlug); | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             ->where('slug', '=', $pageSlug) | 
					
						
							|  |  |  |             ->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (is_null($page)) { | 
					
						
							| 
									
										
										
										
											2024-02-09 00:39:59 +08:00
										 |  |  |             throw new NotFoundException(trans('errors.page_not_found')); | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |     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); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |     public function visibleForList(): Builder | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |         return $this->start() | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |             ->scopes('visible') | 
					
						
							| 
									
										
										
										
											2024-02-08 06:41:45 +08:00
										 |  |  |             ->select($this->mergeBookSlugForSelect(static::$listAttributes)); | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-11 23:42:37 +08:00
										 |  |  |     public function visibleForChapterList(int $chapterId): Builder | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->visibleForList() | 
					
						
							|  |  |  |             ->where('chapter_id', '=', $chapterId) | 
					
						
							|  |  |  |             ->orderBy('draft', 'desc') | 
					
						
							|  |  |  |             ->orderBy('priority', 'asc'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |     public function visibleWithContents(): Builder | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->start() | 
					
						
							|  |  |  |             ->scopes('visible') | 
					
						
							| 
									
										
										
										
											2024-02-08 06:41:45 +08:00
										 |  |  |             ->select($this->mergeBookSlugForSelect(static::$contentAttributes)); | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |     public function currentUserDraftsForList(): Builder | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |         return $this->visibleForList() | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  |             ->where('draft', '=', true) | 
					
						
							|  |  |  |             ->where('created_by', '=', user()->id); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public function visibleTemplates(): Builder | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->visibleForList() | 
					
						
							|  |  |  |             ->where('template', '=', true); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-02-08 06:41:45 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     protected function mergeBookSlugForSelect(array $columns): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return array_merge($columns, ['book_slug' => function ($builder) { | 
					
						
							|  |  |  |             $builder->select('slug') | 
					
						
							|  |  |  |                 ->from('books') | 
					
						
							|  |  |  |                 ->whereColumn('books.id', '=', 'pages.book_id'); | 
					
						
							|  |  |  |         }]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  | } |