| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Http\Controllers\Api; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							|  |  |  | use BookStack\Entities\Models\BookChild; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Chapter; | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  | use BookStack\Entities\Models\Deletion; | 
					
						
							|  |  |  | use BookStack\Entities\Repos\DeletionRepo; | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  | use Closure; | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Builder; | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class RecycleBinApiController extends ApiController | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->middleware(function ($request, $next) { | 
					
						
							|  |  |  |             $this->checkPermission('settings-manage'); | 
					
						
							|  |  |  |             $this->checkPermission('restrictions-manage-all'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return $next($request); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 16:16:45 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a top-level listing of the items in the recycle bin. | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |      * The "deletable" property will reflect the main item deleted. | 
					
						
							|  |  |  |      * For books and chapters, counts of child pages/chapters will | 
					
						
							|  |  |  |      * be loaded within this "deletable" data. | 
					
						
							|  |  |  |      * For chapters & pages, the parent item will be loaded within this "deletable" data. | 
					
						
							|  |  |  |      * Requires permission to manage both system settings and permissions. | 
					
						
							| 
									
										
										
										
											2022-04-24 16:16:45 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  |     public function list() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-04-24 16:16:45 +08:00
										 |  |  |         return $this->apiListingResponse(Deletion::query()->with('deletable'), [ | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  |             'id', | 
					
						
							|  |  |  |             'deleted_by', | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  |             'created_at', | 
					
						
							|  |  |  |             'updated_at', | 
					
						
							|  |  |  |             'deletable_type', | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  |             'deletable_id', | 
					
						
							|  |  |  |         ], [Closure::fromCallable([$this, 'listFormatter'])]); | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 16:16:45 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Restore a single deletion from the recycle bin. | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |      * Requires permission to manage both system settings and permissions. | 
					
						
							| 
									
										
										
										
											2022-04-24 16:16:45 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |     public function restore(DeletionRepo $deletionRepo, string $deletionId) | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |         $restoreCount = $deletionRepo->restore(intval($deletionId)); | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  |         return response()->json(['restore_count' => $restoreCount]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-24 16:16:45 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Remove a single deletion from the recycle bin. | 
					
						
							|  |  |  |      * Use this endpoint carefully as it will entirely remove the underlying deleted items from the system. | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |      * Requires permission to manage both system settings and permissions. | 
					
						
							| 
									
										
										
										
											2022-04-24 16:16:45 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |     public function destroy(DeletionRepo $deletionRepo, string $deletionId) | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |         $deleteCount = $deletionRepo->destroy(intval($deletionId)); | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-07 04:57:18 +08:00
										 |  |  |         return response()->json(['delete_count' => $deleteCount]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Load some related details for the deletion listing. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  |     protected function listFormatter(Deletion $deletion) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $deletable = $deletion->deletable; | 
					
						
							| 
									
										
										
										
											2022-04-26 01:42:31 +08:00
										 |  |  |         $withTrashedQuery = fn (Builder $query) => $query->withTrashed(); | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |         if ($deletable instanceof BookChild) { | 
					
						
							|  |  |  |             $parent = $deletable->getParent(); | 
					
						
							|  |  |  |             $parent->setAttribute('type', $parent->getType()); | 
					
						
							|  |  |  |             $deletable->setRelation('parent', $parent); | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-26 00:54:59 +08:00
										 |  |  |         if ($deletable instanceof Book || $deletable instanceof Chapter) { | 
					
						
							|  |  |  |             $countsToLoad = ['pages' => $withTrashedQuery]; | 
					
						
							|  |  |  |             if ($deletable instanceof Book) { | 
					
						
							|  |  |  |                 $countsToLoad['chapters'] = $withTrashedQuery; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $deletable->loadCount($countsToLoad); | 
					
						
							| 
									
										
										
										
											2022-04-21 04:58:16 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |