move zip export into exportservice
This commit is contained in:
		
							parent
							
								
									ea82c2f61b
								
							
						
					
					
						commit
						e287d965f5
					
				| 
						 | 
					@ -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";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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?
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue