| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Queries; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Entities\Models\Chapter; | 
					
						
							|  |  |  | use BookStack\Exceptions\NotFoundException; | 
					
						
							|  |  |  | use Illuminate\Database\Eloquent\Builder; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ChapterQueries implements ProvidesEntityQueries | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected static array $listAttributes = [ | 
					
						
							|  |  |  |         'id', 'slug', 'name', 'description', 'priority', | 
					
						
							| 
									
										
										
										
											2024-02-09 01:18:03 +08:00
										 |  |  |         'book_id', 'created_at', 'updated_at', 'owned_by', | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function start(): Builder | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return Chapter::query(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function findVisibleById(int $id): ?Chapter | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->start()->scopes('visible')->find($id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |     public function findVisibleByIdOrFail(int $id): Chapter | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->start()->scopes('visible')->findOrFail($id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |     public function findVisibleBySlugsOrFail(string $bookSlug, string $chapterSlug): Chapter | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         /** @var ?Chapter $chapter */ | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |         $chapter = $this->start() | 
					
						
							|  |  |  |             ->scopes('visible') | 
					
						
							|  |  |  |             ->with('book') | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |             ->whereHas('book', function (Builder $query) use ($bookSlug) { | 
					
						
							|  |  |  |                 $query->where('slug', '=', $bookSlug); | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             ->where('slug', '=', $chapterSlug) | 
					
						
							|  |  |  |             ->first(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-06 01:35:49 +08:00
										 |  |  |         if (is_null($chapter)) { | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |             throw new NotFoundException(trans('errors.chapter_not_found')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $chapter; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |     public function usingSlugs(string $bookSlug, string $chapterSlug): Builder | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->start() | 
					
						
							|  |  |  |             ->where('slug', '=', $chapterSlug) | 
					
						
							|  |  |  |             ->whereHas('book', function (Builder $query) use ($bookSlug) { | 
					
						
							|  |  |  |                 $query->where('slug', '=', $bookSlug); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |     public function visibleForList(): Builder | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->start() | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |             ->scopes('visible') | 
					
						
							| 
									
										
										
										
											2024-02-05 23:59:20 +08:00
										 |  |  |             ->select(array_merge(static::$listAttributes, ['book_slug' => function ($builder) { | 
					
						
							|  |  |  |                 $builder->select('slug') | 
					
						
							|  |  |  |                     ->from('books') | 
					
						
							|  |  |  |                     ->whereColumn('books.id', '=', 'chapters.book_id'); | 
					
						
							|  |  |  |             }])); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |