| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  | <?php namespace BookStack\Http\Controllers; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-19 07:38:44 +08:00
										 |  |  | use BookStack\Actions\ActivityType; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Deletion; | 
					
						
							| 
									
										
										
										
											2020-11-22 07:20:54 +08:00
										 |  |  | use BookStack\Entities\Tools\TrashCan; | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class RecycleBinController extends Controller | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     protected $recycleBinBaseUrl = '/settings/recycle-bin'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * On each request to a method of this controller check permissions | 
					
						
							|  |  |  |      * using a middleware closure. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->middleware(function ($request, $next) { | 
					
						
							|  |  |  |             $this->checkPermission('settings-manage'); | 
					
						
							|  |  |  |             $this->checkPermission('restrictions-manage-all'); | 
					
						
							|  |  |  |             return $next($request); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show the top-level listing for the recycle bin. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function index() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $deletions = Deletion::query()->with(['deletable', 'deleter'])->paginate(10); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-22 01:03:24 +08:00
										 |  |  |         $this->setPageTitle(trans('settings.recycle_bin')); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         return view('settings.recycle-bin.index', [ | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |             'deletions' => $deletions, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show the page to confirm a restore of the deletion of the given id. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function showRestore(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var Deletion $deletion */ | 
					
						
							|  |  |  |         $deletion = Deletion::query()->findOrFail($id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return view('settings.recycle-bin.restore', [ | 
					
						
							|  |  |  |             'deletion' => $deletion, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Restore the element attached to the given deletion. | 
					
						
							|  |  |  |      * @throws \Exception | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function restore(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var Deletion $deletion */ | 
					
						
							|  |  |  |         $deletion = Deletion::query()->findOrFail($id); | 
					
						
							| 
									
										
										
										
											2020-11-19 07:38:44 +08:00
										 |  |  |         $this->logActivity(ActivityType::RECYCLE_BIN_RESTORE, $deletion); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         $restoreCount = (new TrashCan())->restoreFromDeletion($deletion); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->showSuccessNotification(trans('settings.recycle_bin_restore_notification', ['count' => $restoreCount])); | 
					
						
							|  |  |  |         return redirect($this->recycleBinBaseUrl); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show the page to confirm a Permanent deletion of the element attached to the deletion of the given id. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function showDestroy(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var Deletion $deletion */ | 
					
						
							|  |  |  |         $deletion = Deletion::query()->findOrFail($id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return view('settings.recycle-bin.destroy', [ | 
					
						
							|  |  |  |             'deletion' => $deletion, | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Permanently delete the content associated with the given deletion. | 
					
						
							|  |  |  |      * @throws \Exception | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function destroy(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var Deletion $deletion */ | 
					
						
							|  |  |  |         $deletion = Deletion::query()->findOrFail($id); | 
					
						
							| 
									
										
										
										
											2020-11-21 02:53:01 +08:00
										 |  |  |         $this->logActivity(ActivityType::RECYCLE_BIN_DESTROY, $deletion); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         $deleteCount = (new TrashCan())->destroyFromDeletion($deletion); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->showSuccessNotification(trans('settings.recycle_bin_destroy_notification', ['count' => $deleteCount])); | 
					
						
							|  |  |  |         return redirect($this->recycleBinBaseUrl); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Empty out the recycle bin. | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |      * @throws \Exception | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function empty() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-11-06 20:54:39 +08:00
										 |  |  |         $deleteCount = (new TrashCan())->empty(); | 
					
						
							| 
									
										
										
										
											2020-10-04 01:53:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-19 07:38:44 +08:00
										 |  |  |         $this->logActivity(ActivityType::RECYCLE_BIN_EMPTY); | 
					
						
							| 
									
										
										
										
											2020-11-03 06:47:48 +08:00
										 |  |  |         $this->showSuccessNotification(trans('settings.recycle_bin_destroy_notification', ['count' => $deleteCount])); | 
					
						
							|  |  |  |         return redirect($this->recycleBinBaseUrl); | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } |