| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Entities\Controllers; | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Chapter; | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  | use BookStack\Entities\Repos\ChapterRepo; | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  | use BookStack\Exceptions\PermissionsException; | 
					
						
							| 
									
										
										
										
											2023-05-19 03:53:39 +08:00
										 |  |  | use BookStack\Http\ApiController; | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  | use Exception; | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Relations\HasMany; | 
					
						
							|  |  |  | use Illuminate\Http\Request; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ChapterApiController extends ApiController | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected $rules = [ | 
					
						
							|  |  |  |         'create' => [ | 
					
						
							| 
									
										
										
										
											2023-12-21 21:23:52 +08:00
										 |  |  |             'book_id'          => ['required', 'integer'], | 
					
						
							|  |  |  |             'name'             => ['required', 'string', 'max:255'], | 
					
						
							|  |  |  |             'description'      => ['string', 'max:1900'], | 
					
						
							|  |  |  |             'description_html' => ['string', 'max:2000'], | 
					
						
							|  |  |  |             'tags'             => ['array'], | 
					
						
							|  |  |  |             'priority'         => ['integer'], | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         ], | 
					
						
							|  |  |  |         'update' => [ | 
					
						
							| 
									
										
										
										
											2023-12-21 21:23:52 +08:00
										 |  |  |             'book_id'          => ['integer'], | 
					
						
							|  |  |  |             'name'             => ['string', 'min:1', 'max:255'], | 
					
						
							|  |  |  |             'description'      => ['string', 'max:1900'], | 
					
						
							|  |  |  |             'description_html' => ['string', 'max:2000'], | 
					
						
							|  |  |  |             'tags'             => ['array'], | 
					
						
							|  |  |  |             'priority'         => ['integer'], | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         ], | 
					
						
							|  |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected ChapterRepo $chapterRepo | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get a listing of chapters visible to the user. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function list() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapters = Chapter::visible(); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         return $this->apiListingResponse($chapters, [ | 
					
						
							|  |  |  |             'id', 'book_id', 'name', 'slug', 'description', 'priority', | 
					
						
							| 
									
										
										
										
											2021-01-04 06:29:58 +08:00
										 |  |  |             'created_at', 'updated_at', 'created_by', 'updated_by', 'owned_by', | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Create a new chapter in the system. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function create(Request $request) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  |         $requestData = $this->validate($request, $this->rules['create']); | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $bookId = $request->get('book_id'); | 
					
						
							|  |  |  |         $book = Book::visible()->findOrFail($bookId); | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-create', $book); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  |         $chapter = $this->chapterRepo->create($requestData, $book); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-21 21:23:52 +08:00
										 |  |  |         return response()->json($this->forJsonDisplay($chapter)); | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * View the details of a single chapter. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function read(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-12-21 21:23:52 +08:00
										 |  |  |         $chapter = Chapter::visible()->findOrFail($id); | 
					
						
							|  |  |  |         $chapter = $this->forJsonDisplay($chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $chapter->load([ | 
					
						
							|  |  |  |             'createdBy', 'updatedBy', 'ownedBy', | 
					
						
							|  |  |  |             'pages' => function (HasMany $query) { | 
					
						
							|  |  |  |                 $query->scopes('visible')->get(['id', 'name', 'slug']); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         return response()->json($chapter); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Update the details of a single chapter. | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  |      * Providing a 'book_id' property will essentially move the chapter | 
					
						
							|  |  |  |      * into that parent element if you have permissions to do so. | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function update(Request $request, string $id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  |         $requestData = $this->validate($request, $this->rules()['update']); | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         $chapter = Chapter::visible()->findOrFail($id); | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-update', $chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  |         if ($request->has('book_id') && $chapter->book_id !== intval($requestData['book_id'])) { | 
					
						
							|  |  |  |             $this->checkOwnablePermission('chapter-delete', $chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 $this->chapterRepo->move($chapter, "book:{$requestData['book_id']}"); | 
					
						
							|  |  |  |             } catch (Exception $exception) { | 
					
						
							| 
									
										
										
										
											2023-12-21 21:23:52 +08:00
										 |  |  |                 if ($exception instanceof PermissionsException) { | 
					
						
							| 
									
										
										
										
											2023-05-31 03:55:24 +08:00
										 |  |  |                     $this->showPermissionError(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return $this->jsonError(trans('errors.selected_book_not_found')); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $updatedChapter = $this->chapterRepo->update($chapter, $requestData); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-21 21:23:52 +08:00
										 |  |  |         return response()->json($this->forJsonDisplay($updatedChapter)); | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2020-11-28 23:21:54 +08:00
										 |  |  |      * Delete a chapter. | 
					
						
							|  |  |  |      * This will typically send the chapter to the recycle bin. | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function delete(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = Chapter::visible()->findOrFail($id); | 
					
						
							|  |  |  |         $this->checkOwnablePermission('chapter-delete', $chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->chapterRepo->destroy($chapter); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  |         return response('', 204); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-12-21 21:23:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     protected function forJsonDisplay(Chapter $chapter): Chapter | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = clone $chapter; | 
					
						
							|  |  |  |         $chapter->unsetRelations()->refresh(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $chapter->load(['tags']); | 
					
						
							|  |  |  |         $chapter->makeVisible('description_html') | 
					
						
							|  |  |  |             ->setAttribute('description_html', $chapter->descriptionHtml()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $chapter; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-05-23 07:28:41 +08:00
										 |  |  | } |