| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Entities\Tools; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\ActivityType; | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											2022-06-14 23:42:29 +08:00
										 |  |  | use BookStack\Facades\Activity; | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class HierarchyTransformer | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected BookRepo $bookRepo; | 
					
						
							|  |  |  |     protected BookshelfRepo $shelfRepo; | 
					
						
							|  |  |  |     protected Cloner $cloner; | 
					
						
							|  |  |  |     protected TrashCan $trashCan; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 23:42:29 +08:00
										 |  |  |     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. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  |     public function transformChapterToBook(Chapter $chapter): Book | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $inputData = $this->cloner->entityToInputData($chapter); | 
					
						
							|  |  |  |         $book = $this->bookRepo->create($inputData); | 
					
						
							| 
									
										
										
										
											2022-06-14 22:55:44 +08:00
										 |  |  |         $this->cloner->copyEntityPermissions($chapter, $book); | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /** @var Page $page */ | 
					
						
							|  |  |  |         foreach ($chapter->pages as $page) { | 
					
						
							|  |  |  |             $page->chapter_id = 0; | 
					
						
							|  |  |  |             $page->changeBook($book->id); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->trashCan->destroyEntity($chapter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-15 22:05:08 +08:00
										 |  |  |         Activity::add(ActivityType::BOOK_CREATE_FROM_CHAPTER, $book); | 
					
						
							| 
									
										
										
										
											2022-06-20 01:14:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  |         return $book; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-15 22:05:08 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Transform a book into a shelf. | 
					
						
							|  |  |  |      * Does not check permissions, check before calling. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  |     public function transformBookToShelf(Book $book): Bookshelf | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $inputData = $this->cloner->entityToInputData($book); | 
					
						
							|  |  |  |         $shelf = $this->shelfRepo->create($inputData, []); | 
					
						
							| 
									
										
										
										
											2022-06-14 22:55:44 +08:00
										 |  |  |         $this->cloner->copyEntityPermissions($book, $shelf); | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $shelfBookSyncData = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** @var Chapter $chapter */ | 
					
						
							|  |  |  |         foreach ($book->chapters as $index => $chapter) { | 
					
						
							|  |  |  |             $newBook = $this->transformChapterToBook($chapter); | 
					
						
							|  |  |  |             $shelfBookSyncData[$newBook->id] = ['order' => $index]; | 
					
						
							| 
									
										
										
										
											2022-10-10 23:58:26 +08:00
										 |  |  |             if (!$newBook->hasPermissions()) { | 
					
						
							| 
									
										
										
										
											2022-06-15 22:05:08 +08:00
										 |  |  |                 $this->cloner->copyEntityPermissions($shelf, $newBook); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($book->directPages->count() > 0) { | 
					
						
							|  |  |  |             $book->name .= ' ' . trans('entities.pages'); | 
					
						
							| 
									
										
										
										
											2022-06-15 22:05:08 +08:00
										 |  |  |             $shelfBookSyncData[$book->id] = ['order' => count($shelfBookSyncData) + 1]; | 
					
						
							|  |  |  |             $book->save(); | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             $this->trashCan->destroyEntity($book); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-15 22:05:08 +08:00
										 |  |  |         $shelf->books()->sync($shelfBookSyncData); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Activity::add(ActivityType::BOOKSHELF_CREATE_FROM_BOOK, $shelf); | 
					
						
							| 
									
										
										
										
											2022-06-20 01:14:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  |         return $shelf; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-06-20 01:14:53 +08:00
										 |  |  | } |