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);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |