110 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
|  | <?php namespace BookStack\Entities\Managers; | ||
|  | 
 | ||
|  | use BookStack\Entities\Book; | ||
|  | use BookStack\Entities\Bookshelf; | ||
|  | use BookStack\Entities\Chapter; | ||
|  | use BookStack\Entities\Entity; | ||
|  | use BookStack\Entities\HasCoverImage; | ||
|  | use BookStack\Entities\Page; | ||
|  | use BookStack\Exceptions\NotifyException; | ||
|  | use BookStack\Facades\Activity; | ||
|  | use BookStack\Uploads\AttachmentService; | ||
|  | use BookStack\Uploads\ImageService; | ||
|  | use Exception; | ||
|  | use Illuminate\Contracts\Container\BindingResolutionException; | ||
|  | 
 | ||
|  | class TrashCan | ||
|  | { | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Remove a bookshelf from the system. | ||
|  |      * @throws Exception | ||
|  |      */ | ||
|  |     public function destroyShelf(Bookshelf $shelf) | ||
|  |     { | ||
|  |         $this->destroyCommonRelations($shelf); | ||
|  |         $shelf->delete(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Remove a book from the system. | ||
|  |      * @throws NotifyException | ||
|  |      * @throws BindingResolutionException | ||
|  |      */ | ||
|  |     public function destroyBook(Book $book) | ||
|  |     { | ||
|  |         foreach ($book->pages as $page) { | ||
|  |             $this->destroyPage($page); | ||
|  |         } | ||
|  | 
 | ||
|  |         foreach ($book->chapters as $chapter) { | ||
|  |             $this->destroyChapter($chapter); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->destroyCommonRelations($book); | ||
|  |         $book->delete(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Remove a page from the system. | ||
|  |      * @throws NotifyException | ||
|  |      */ | ||
|  |     public function destroyPage(Page $page) | ||
|  |     { | ||
|  |         // Check if set as custom homepage & remove setting if not used or throw error if active
 | ||
|  |         $customHome = setting('app-homepage', '0:'); | ||
|  |         if (intval($page->id) === intval(explode(':', $customHome)[0])) { | ||
|  |             if (setting('app-homepage-type') === 'page') { | ||
|  |                 throw new NotifyException(trans('errors.page_custom_home_deletion'), $page->getUrl()); | ||
|  |             } | ||
|  |             setting()->remove('app-homepage'); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->destroyCommonRelations($page); | ||
|  | 
 | ||
|  |         // Delete Attached Files
 | ||
|  |         $attachmentService = app(AttachmentService::class); | ||
|  |         foreach ($page->attachments as $attachment) { | ||
|  |             $attachmentService->deleteFile($attachment); | ||
|  |         } | ||
|  | 
 | ||
|  |         $page->delete(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Remove a chapter from the system. | ||
|  |      * @throws Exception | ||
|  |      */ | ||
|  |     public function destroyChapter(Chapter $chapter) | ||
|  |     { | ||
|  |         if (count($chapter->pages) > 0) { | ||
|  |             foreach ($chapter->pages as $page) { | ||
|  |                 $page->chapter_id = 0; | ||
|  |                 $page->save(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->destroyCommonRelations($chapter); | ||
|  |         $chapter->delete(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Update entity relations to remove or update outstanding connections. | ||
|  |      */ | ||
|  |     protected function destroyCommonRelations(Entity $entity) | ||
|  |     { | ||
|  |         Activity::removeEntity($entity); | ||
|  |         $entity->views()->delete(); | ||
|  |         $entity->permissions()->delete(); | ||
|  |         $entity->tags()->delete(); | ||
|  |         $entity->comments()->delete(); | ||
|  |         $entity->jointPermissions()->delete(); | ||
|  |         $entity->searchTerms()->delete(); | ||
|  | 
 | ||
|  |         if ($entity instanceof HasCoverImage && $entity->cover) { | ||
|  |             $imageService = app()->make(ImageService::class); | ||
|  |             $imageService->destroy($entity->cover); | ||
|  |         } | ||
|  |     } | ||
|  | } |