+ // TODO - In transaction?
+ // TODO - Revert uploaded files if goes wrong
+ }
+
+ protected function importBook(ZipExportBook $exportBook, ZipExportReader $reader): Book
+ {
+ $book = $this->bookRepo->create([
+ 'name' => $exportBook->name,
+ 'description_html' => $exportBook->description_html ?? '',
+ 'image' => $exportBook->cover ? $this->zipFileToUploadedFile($exportBook->cover, $reader) : null,
+ 'tags' => $this->exportTagsToInputArray($exportBook->tags ?? []),
+ ]);
+
+ // TODO - Parse/format description_html references
+
+ if ($book->cover) {
+ $this->createdImages[] = $book->cover;
+ }
+
+ // TODO - Pages
+ foreach ($exportBook->chapters as $exportChapter) {
+ $this->importChapter($exportChapter, $book);
+ }
+ // TODO - Sort chapters/pages by order
+
+ return $book;
+ }
+
+ protected function importChapter(ZipExportChapter $exportChapter, Book $parent, ZipExportReader $reader): Chapter
+ {
+ $chapter = $this->chapterRepo->create([
+ 'name' => $exportChapter->name,
+ 'description_html' => $exportChapter->description_html ?? '',
+ 'tags' => $this->exportTagsToInputArray($exportChapter->tags ?? []),
+ ], $parent);
+
+ // TODO - Parse/format description_html references
+
+ $exportPages = $exportChapter->pages;
+ usort($exportPages, function (ZipExportPage $a, ZipExportPage $b) {
+ return ($a->priority ?? 0) - ($b->priority ?? 0);
+ });
+
+ foreach ($exportPages as $exportPage) {
+ //
+ }
+ // TODO - Pages
+
+ return $chapter;
+ }
+
+ protected function importPage(ZipExportPage $exportPage, Book|Chapter $parent, ZipExportReader $reader): Page
+ {
+ $page = $this->pageRepo->getNewDraftPage($parent);
+
+ // TODO - Import attachments
+ // TODO - Import images
+ // TODO - Parse/format HTML
+
+ $this->pageRepo->publishDraft($page, [
+ 'name' => $exportPage->name,
+ 'markdown' => $exportPage->markdown,
+ 'html' => $exportPage->html,
+ 'tags' => $this->exportTagsToInputArray($exportPage->tags ?? []),
+ ]);
+
+ return $page;
+ }
+
+ protected function exportTagsToInputArray(array $exportTags): array
+ {
+ $tags = [];
+
+ /** @var ZipExportTag $tag */
+ foreach ($exportTags as $tag) {
+ $tags[] = ['name' => $tag->name, 'value' => $tag->value ?? ''];
+ }
+
+ return $tags;
+ }
+
+ protected function zipFileToUploadedFile(string $fileName, ZipExportReader $reader): UploadedFile
+ {
+ $tempPath = tempnam(sys_get_temp_dir(), 'bszipextract');
+ $fileStream = $reader->streamFile($fileName);
+ $tempStream = fopen($tempPath, 'wb');
+ stream_copy_to_stream($fileStream, $tempStream);
+ fclose($tempStream);
+
+ $this->tempFilesToCleanup[] = $tempPath;
+
+ return new UploadedFile($tempPath, $fileName);