move zip export into exportservice

This commit is contained in:
Nikhil Jha 2020-05-13 20:07:19 -07:00
parent ea82c2f61b
commit e287d965f5
2 changed files with 26 additions and 16 deletions

View File

@ -8,6 +8,7 @@ use Exception;
use SnappyPDF; use SnappyPDF;
use League\HTMLToMarkdown\HtmlConverter; use League\HTMLToMarkdown\HtmlConverter;
use Throwable; use Throwable;
use ZipArchive;
class ExportService class ExportService
{ {
@ -271,4 +272,27 @@ class ExportService
} }
return $text; return $text;
} }
/**
* Convert a book into a zip file.
*/
public function bookToZip(Book $book): string
{
// TODO: Is not unlinking the file a security risk?
$z = new ZipArchive();
$z->open("book.zip", \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
$bookTree = (new BookContents($book))->getTree(false, true);
foreach ($bookTree as $bookChild) {
if ($bookChild->isA('chapter')) {
$z->addEmptyDir($bookChild->name);
foreach ($bookChild->pages as $page) {
$filename = $bookChild->name . "/" . $page->name . ".md";
$z->addFromString($filename, $this->pageToMarkdown($page));
}
} else {
$z->addFromString($bookChild->name . ".md", $this->pageToMarkdown($bookChild));
}
}
return "book.zip";
}
} }

View File

@ -6,7 +6,6 @@ use BookStack\Entities\Managers\BookContents;
use BookStack\Entities\ExportService; use BookStack\Entities\ExportService;
use BookStack\Entities\Repos\BookRepo; use BookStack\Entities\Repos\BookRepo;
use Throwable; use Throwable;
use ZipArchive;
class BookExportController extends Controller class BookExportController extends Controller
{ {
@ -72,20 +71,7 @@ class BookExportController extends Controller
public function zip(string $bookSlug) public function zip(string $bookSlug)
{ {
$book = $this->bookRepo->getBySlug($bookSlug); $book = $this->bookRepo->getBySlug($bookSlug);
$z = new ZipArchive(); $filename = $this->exportService->bookToZip($book);
$z->open("book.zip", \ZipArchive::CREATE | \ZipArchive::OVERWRITE); return response()->download($filename);
$bookTree = (new BookContents($book))->getTree(false, true);
foreach ($bookTree as $bookChild) {
if ($bookChild->isA('chapter')) {
$z->addEmptyDir($bookChild->name);
foreach ($bookChild->pages as $page) {
$z->addFromString($bookChild->name . "/" . $page->name . ".md", $this->exportService->pageToMarkdown($page));
}
} else {
$z->addFromString($bookChild->name . ".md", $this->exportService->pageToMarkdown($bookChild));
}
}
return response()->download('book.zip');
// TODO: Is not unlinking it a security issue?
} }
} }