2022-06-14 00:20:21 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace BookStack\Entities\Tools;
|
|
|
|
|
2022-06-14 23:42:29 +08:00
|
|
|
use BookStack\Actions\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-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-06-15 22:05:08 +08:00
|
|
|
if (!$newBook->restricted) {
|
|
|
|
$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-14 00:20:21 +08:00
|
|
|
return $shelf;
|
|
|
|
}
|
|
|
|
}
|