X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/d3cd369247a4c49e626264e40528174b309d241c..refs/pull/1630/head:/app/Http/Controllers/BookController.php diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php index 862d2b021..a990eed9a 100644 --- a/app/Http/Controllers/BookController.php +++ b/app/Http/Controllers/BookController.php @@ -6,6 +6,7 @@ use BookStack\Entities\Book; use BookStack\Entities\EntityContextManager; use BookStack\Entities\Repos\EntityRepo; use BookStack\Entities\ExportService; +use BookStack\Uploads\ImageRepo; use Illuminate\Http\Request; use Illuminate\Http\Response; use Views; @@ -17,6 +18,7 @@ class BookController extends Controller protected $userRepo; protected $exportService; protected $entityContextManager; + protected $imageRepo; /** * BookController constructor. @@ -24,17 +26,20 @@ class BookController extends Controller * @param UserRepo $userRepo * @param ExportService $exportService * @param EntityContextManager $entityContextManager + * @param ImageRepo $imageRepo */ public function __construct( EntityRepo $entityRepo, UserRepo $userRepo, ExportService $exportService, - EntityContextManager $entityContextManager + EntityContextManager $entityContextManager, + ImageRepo $imageRepo ) { $this->entityRepo = $entityRepo; $this->userRepo = $userRepo; $this->exportService = $exportService; $this->entityContextManager = $entityContextManager; + $this->imageRepo = $imageRepo; parent::__construct(); } @@ -75,15 +80,16 @@ class BookController extends Controller /** * Show the form for creating a new book. + * @param string $shelfSlug * @return Response + * @throws \BookStack\Exceptions\NotFoundException */ - public function create($shelfSlug = null) + public function create(string $shelfSlug = null) { + $bookshelf = null; if ($shelfSlug !== null) { $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug); $this->checkOwnablePermission('bookshelf-update', $bookshelf); - } else { - $bookshelf = null; } $this->checkPermission('book-create-all'); @@ -97,39 +103,33 @@ class BookController extends Controller * Store a newly created book in storage. * * @param Request $request - * @param $shelfSlug + * @param string $shelfSlug * @return Response + * @throws \BookStack\Exceptions\NotFoundException + * @throws \BookStack\Exceptions\ImageUploadException */ - public function store(Request $request, $shelfSlug = null) + public function store(Request $request, string $shelfSlug = null) { + $this->checkPermission('book-create-all'); + $this->validate($request, [ + 'name' => 'required|string|max:255', + 'description' => 'string|max:1000', + 'image' => $this->imageRepo->getImageValidationRules(), + ]); + + $bookshelf = null; if ($shelfSlug !== null) { $bookshelf = $this->entityRepo->getBySlug('bookshelf', $shelfSlug); $this->checkOwnablePermission('bookshelf-update', $bookshelf); - - $shelfBooks = $this->entityRepo->getBookshelfChildren($bookshelf); - $shelfBookIds = $shelfBooks->pluck('id'); - } else { - $bookshelf = null; } - $this->checkPermission('book-create-all'); - $this->validate($request, [ - 'name' => 'required|string|max:255', - 'description' => 'string|max:1000' - ]); $book = $this->entityRepo->createFromInput('book', $request->all()); + $this->bookUpdateActions($book, $request); Activity::add($book, 'book_create', $book->id); if ($bookshelf) { - $shelfBookIds = $shelfBookIds->toArray(); - array_unshift($shelfBookIds, $book->id); - - $shelfBookIds = implode(',', $shelfBookIds); - - $this->entityRepo->updateShelfBooks($bookshelf, $shelfBookIds); + $this->entityRepo->appendBookToShelf($bookshelf, $book); Activity::add($bookshelf, 'bookshelf_update'); - - return redirect($bookshelf->getUrl()); } return redirect($book->getUrl()); @@ -178,20 +178,27 @@ class BookController extends Controller /** * Update the specified book in storage. - * @param Request $request + * @param Request $request * @param $slug * @return Response + * @throws \BookStack\Exceptions\ImageUploadException + * @throws \BookStack\Exceptions\NotFoundException */ - public function update(Request $request, $slug) + public function update(Request $request, string $slug) { $book = $this->entityRepo->getBySlug('book', $slug); $this->checkOwnablePermission('book-update', $book); $this->validate($request, [ 'name' => 'required|string|max:255', - 'description' => 'string|max:1000' + 'description' => 'string|max:1000', + 'image' => $this->imageRepo->getImageValidationRules(), ]); + $book = $this->entityRepo->updateFromInput('book', $book, $request->all()); + $this->bookUpdateActions($book, $request); + Activity::add($book, 'book_update', $book->id); + return redirect($book->getUrl()); } @@ -319,7 +326,12 @@ class BookController extends Controller $book = $this->entityRepo->getBySlug('book', $bookSlug); $this->checkOwnablePermission('book-delete', $book); Activity::addMessage('book_delete', 0, $book->name); + + if ($book->cover) { + $this->imageRepo->destroyImage($book->cover); + } $this->entityRepo->destroyBook($book); + return redirect('/books'); } @@ -391,4 +403,29 @@ class BookController extends Controller $textContent = $this->exportService->bookToPlainText($book); return $this->downloadResponse($textContent, $bookSlug . '.txt'); } + + /** + * Common actions to run on book update. + * Handles updating the cover image. + * @param Book $book + * @param Request $request + * @throws \BookStack\Exceptions\ImageUploadException + */ + protected function bookUpdateActions(Book $book, Request $request) + { + // Update the cover image if in request + if ($request->has('image')) { + $this->imageRepo->destroyImage($book->cover); + $newImage = $request->file('image'); + $image = $this->imageRepo->saveNew($newImage, 'cover_book', $book->id, 512, 512, true); + $book->image_id = $image->id; + $book->save(); + } + + if ($request->has('image_reset')) { + $this->imageRepo->destroyImage($book->cover); + $book->image_id = 0; + $book->save(); + } + } }