88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace BookStack\Entities\Tools;
 | |
| 
 | |
| use BookStack\Actions\ActivityType;
 | |
| use BookStack\Entities\Models\Book;
 | |
| use BookStack\Entities\Models\Bookshelf;
 | |
| use BookStack\Entities\Models\Chapter;
 | |
| use BookStack\Entities\Models\Page;
 | |
| use BookStack\Entities\Repos\BookRepo;
 | |
| use BookStack\Entities\Repos\BookshelfRepo;
 | |
| use BookStack\Facades\Activity;
 | |
| 
 | |
| class HierarchyTransformer
 | |
| {
 | |
|     protected BookRepo $bookRepo;
 | |
|     protected BookshelfRepo $shelfRepo;
 | |
|     protected Cloner $cloner;
 | |
|     protected TrashCan $trashCan;
 | |
| 
 | |
|     public function __construct(BookRepo $bookRepo, BookshelfRepo $shelfRepo, Cloner $cloner, TrashCan $trashCan)
 | |
|     {
 | |
|         $this->bookRepo = $bookRepo;
 | |
|         $this->shelfRepo = $shelfRepo;
 | |
|         $this->cloner = $cloner;
 | |
|         $this->trashCan = $trashCan;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Transform a chapter into a book.
 | |
|      * Does not check permissions, check before calling.
 | |
|      */
 | |
|     public function transformChapterToBook(Chapter $chapter): Book
 | |
|     {
 | |
|         $inputData = $this->cloner->entityToInputData($chapter);
 | |
|         $book = $this->bookRepo->create($inputData);
 | |
|         $this->cloner->copyEntityPermissions($chapter, $book);
 | |
| 
 | |
|         /** @var Page $page */
 | |
|         foreach ($chapter->pages as $page) {
 | |
|             $page->chapter_id = 0;
 | |
|             $page->changeBook($book->id);
 | |
|         }
 | |
| 
 | |
|         $this->trashCan->destroyEntity($chapter);
 | |
| 
 | |
|         Activity::add(ActivityType::BOOK_CREATE_FROM_CHAPTER, $book);
 | |
| 
 | |
|         return $book;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Transform a book into a shelf.
 | |
|      * Does not check permissions, check before calling.
 | |
|      */
 | |
|     public function transformBookToShelf(Book $book): Bookshelf
 | |
|     {
 | |
|         $inputData = $this->cloner->entityToInputData($book);
 | |
|         $shelf = $this->shelfRepo->create($inputData, []);
 | |
|         $this->cloner->copyEntityPermissions($book, $shelf);
 | |
| 
 | |
|         $shelfBookSyncData = [];
 | |
| 
 | |
|         /** @var Chapter $chapter */
 | |
|         foreach ($book->chapters as $index => $chapter) {
 | |
|             $newBook = $this->transformChapterToBook($chapter);
 | |
|             $shelfBookSyncData[$newBook->id] = ['order' => $index];
 | |
|             if (!$newBook->restricted) {
 | |
|                 $this->cloner->copyEntityPermissions($shelf, $newBook);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if ($book->directPages->count() > 0) {
 | |
|             $book->name .= ' ' . trans('entities.pages');
 | |
|             $shelfBookSyncData[$book->id] = ['order' => count($shelfBookSyncData) + 1];
 | |
|             $book->save();
 | |
|         } else {
 | |
|             $this->trashCan->destroyEntity($book);
 | |
|         }
 | |
| 
 | |
|         $shelf->books()->sync($shelfBookSyncData);
 | |
| 
 | |
|         Activity::add(ActivityType::BOOKSHELF_CREATE_FROM_BOOK, $shelf);
 | |
| 
 | |
|         return $shelf;
 | |
|     }
 | |
| }
 |