diff --git a/app/Http/Controllers/BookshelfController.php b/app/Http/Controllers/BookshelfController.php index b86bc2e38..e63cfd1d5 100644 --- a/app/Http/Controllers/BookshelfController.php +++ b/app/Http/Controllers/BookshelfController.php @@ -5,6 +5,7 @@ use BookStack\Auth\UserRepo; use BookStack\Entities\Bookshelf; use BookStack\Entities\EntityContextManager; use BookStack\Entities\Repos\EntityRepo; +use BookStack\Uploads\ImageRepo; use Illuminate\Http\Request; use Illuminate\Http\Response; use Views; @@ -15,18 +16,21 @@ class BookshelfController extends Controller protected $entityRepo; protected $userRepo; protected $entityContextManager; + protected $imageRepo; /** * BookController constructor. * @param EntityRepo $entityRepo * @param UserRepo $userRepo * @param EntityContextManager $entityContextManager + * @param ImageRepo $imageRepo */ - public function __construct(EntityRepo $entityRepo, UserRepo $userRepo, EntityContextManager $entityContextManager) + public function __construct(EntityRepo $entityRepo, UserRepo $userRepo, EntityContextManager $entityContextManager, ImageRepo $imageRepo) { $this->entityRepo = $entityRepo; $this->userRepo = $userRepo; $this->entityContextManager = $entityContextManager; + $this->imageRepo = $imageRepo; parent::__construct(); } @@ -91,13 +95,14 @@ class BookshelfController extends Controller $this->validate($request, [ 'name' => 'required|string|max:255', 'description' => 'string|max:1000', + 'image' => $this->imageRepo->getImageValidationRules(), ]); - $bookshelf = $this->entityRepo->createFromInput('bookshelf', $request->all()); - $this->entityRepo->updateShelfBooks($bookshelf, $request->get('books', '')); - Activity::add($bookshelf, 'bookshelf_create'); + $shelf = $this->entityRepo->createFromInput('bookshelf', $request->all()); + $this->shelfUpdateActions($shelf, $request); - return redirect($bookshelf->getUrl()); + Activity::add($shelf, 'bookshelf_create'); + return redirect($shelf->getUrl()); } @@ -109,19 +114,19 @@ class BookshelfController extends Controller */ public function show(string $slug) { - /** @var Bookshelf $bookshelf */ - $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug); - $this->checkOwnablePermission('book-view', $bookshelf); + /** @var Bookshelf $shelf */ + $shelf = $this->entityRepo->getBySlug('bookshelf', $slug); + $this->checkOwnablePermission('book-view', $shelf); - $books = $this->entityRepo->getBookshelfChildren($bookshelf); - Views::add($bookshelf); - $this->entityContextManager->setShelfContext($bookshelf->id); + $books = $this->entityRepo->getBookshelfChildren($shelf); + Views::add($shelf); + $this->entityContextManager->setShelfContext($shelf->id); - $this->setPageTitle($bookshelf->getShortName()); + $this->setPageTitle($shelf->getShortName()); return view('shelves.show', [ - 'shelf' => $bookshelf, + 'shelf' => $shelf, 'books' => $books, - 'activity' => Activity::entityActivity($bookshelf, 20, 1) + 'activity' => Activity::entityActivity($shelf, 20, 1) ]); } @@ -133,19 +138,19 @@ class BookshelfController extends Controller */ public function edit(string $slug) { - $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug); /** @var $bookshelf Bookshelf */ - $this->checkOwnablePermission('bookshelf-update', $bookshelf); + $shelf = $this->entityRepo->getBySlug('bookshelf', $slug); /** @var $shelf Bookshelf */ + $this->checkOwnablePermission('bookshelf-update', $shelf); - $shelfBooks = $this->entityRepo->getBookshelfChildren($bookshelf); + $shelfBooks = $this->entityRepo->getBookshelfChildren($shelf); $shelfBookIds = $shelfBooks->pluck('id'); $books = $this->entityRepo->getAll('book', false, 'update'); $books = $books->filter(function ($book) use ($shelfBookIds) { return !$shelfBookIds->contains($book->id); }); - $this->setPageTitle(trans('entities.shelves_edit_named', ['name' => $bookshelf->getShortName()])); + $this->setPageTitle(trans('entities.shelves_edit_named', ['name' => $shelf->getShortName()])); return view('shelves.edit', [ - 'shelf' => $bookshelf, + 'shelf' => $shelf, 'books' => $books, 'shelfBooks' => $shelfBooks, ]); @@ -154,10 +159,11 @@ class BookshelfController extends Controller /** * Update the specified bookshelf in storage. - * @param Request $request + * @param Request $request * @param string $slug * @return Response * @throws \BookStack\Exceptions\NotFoundException + * @throws \BookStack\Exceptions\ImageUploadException */ public function update(Request $request, string $slug) { @@ -166,10 +172,12 @@ class BookshelfController extends Controller $this->validate($request, [ 'name' => 'required|string|max:255', 'description' => 'string|max:1000', + 'image' => $this->imageRepo->getImageValidationRules(), ]); $shelf = $this->entityRepo->updateFromInput('bookshelf', $shelf, $request->all()); - $this->entityRepo->updateShelfBooks($shelf, $request->get('books', '')); + $this->shelfUpdateActions($shelf, $request); + Activity::add($shelf, 'bookshelf_update'); return redirect($shelf->getUrl()); @@ -184,11 +192,11 @@ class BookshelfController extends Controller */ public function showDelete(string $slug) { - $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug); /** @var $bookshelf Bookshelf */ - $this->checkOwnablePermission('bookshelf-delete', $bookshelf); + $shelf = $this->entityRepo->getBySlug('bookshelf', $slug); /** @var $shelf Bookshelf */ + $this->checkOwnablePermission('bookshelf-delete', $shelf); - $this->setPageTitle(trans('entities.shelves_delete_named', ['name' => $bookshelf->getShortName()])); - return view('shelves.delete', ['shelf' => $bookshelf]); + $this->setPageTitle(trans('entities.shelves_delete_named', ['name' => $shelf->getShortName()])); + return view('shelves.delete', ['shelf' => $shelf]); } /** @@ -200,10 +208,15 @@ class BookshelfController extends Controller */ public function destroy(string $slug) { - $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug); /** @var $bookshelf Bookshelf */ - $this->checkOwnablePermission('bookshelf-delete', $bookshelf); - Activity::addMessage('bookshelf_delete', 0, $bookshelf->name); - $this->entityRepo->destroyBookshelf($bookshelf); + $shelf = $this->entityRepo->getBySlug('bookshelf', $slug); /** @var $shelf Bookshelf */ + $this->checkOwnablePermission('bookshelf-delete', $shelf); + Activity::addMessage('bookshelf_delete', 0, $shelf->name); + + if ($shelf->cover) { + $this->imageRepo->destroyImage($shelf->cover); + } + $this->entityRepo->destroyBookshelf($shelf); + return redirect('/shelves'); } @@ -215,12 +228,12 @@ class BookshelfController extends Controller */ public function showPermissions(string $slug) { - $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug); - $this->checkOwnablePermission('restrictions-manage', $bookshelf); + $shelf = $this->entityRepo->getBySlug('bookshelf', $slug); + $this->checkOwnablePermission('restrictions-manage', $shelf); $roles = $this->userRepo->getRestrictableRoles(); return view('shelves.permissions', [ - 'shelf' => $bookshelf, + 'shelf' => $shelf, 'roles' => $roles ]); } @@ -235,12 +248,12 @@ class BookshelfController extends Controller */ public function permissions(string $slug, Request $request) { - $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug); - $this->checkOwnablePermission('restrictions-manage', $bookshelf); + $shelf = $this->entityRepo->getBySlug('bookshelf', $slug); + $this->checkOwnablePermission('restrictions-manage', $shelf); - $this->entityRepo->updateEntityPermissionsFromRequest($request, $bookshelf); + $this->entityRepo->updateEntityPermissionsFromRequest($request, $shelf); session()->flash('success', trans('entities.shelves_permissions_updated')); - return redirect($bookshelf->getUrl()); + return redirect($shelf->getUrl()); } /** @@ -251,11 +264,30 @@ class BookshelfController extends Controller */ public function copyPermissions(string $slug) { - $bookshelf = $this->entityRepo->getBySlug('bookshelf', $slug); - $this->checkOwnablePermission('restrictions-manage', $bookshelf); + $shelf = $this->entityRepo->getBySlug('bookshelf', $slug); + $this->checkOwnablePermission('restrictions-manage', $shelf); - $updateCount = $this->entityRepo->copyBookshelfPermissions($bookshelf); + $updateCount = $this->entityRepo->copyBookshelfPermissions($shelf); session()->flash('success', trans('entities.shelves_copy_permission_success', ['count' => $updateCount])); - return redirect($bookshelf->getUrl()); + return redirect($shelf->getUrl()); + } + + /** + * Common actions to run on bookshelf update. + * @param Bookshelf $shelf + * @param Request $request + * @throws \BookStack\Exceptions\ImageUploadException + */ + protected function shelfUpdateActions(Bookshelf $shelf, Request $request) + { + // Update the books that the shelf references + $this->entityRepo->updateShelfBooks($shelf, $request->get('books', '')); + + // Update the cover image if in request + if ($request->has('image') && userCan('image-create-all')) { + $image = $this->imageRepo->saveNew($request->file('image'), 'cover', $shelf->id); + $shelf->image_id = $image->id; + $shelf->save(); + } } } diff --git a/app/Http/Controllers/Images/CoverImageController.php b/app/Http/Controllers/Images/CoverImageController.php index 807fddc38..fdec56be9 100644 --- a/app/Http/Controllers/Images/CoverImageController.php +++ b/app/Http/Controllers/Images/CoverImageController.php @@ -2,6 +2,10 @@ namespace BookStack\Http\Controllers\Images; +// TODO - Replace this with entity-level handling +// Since won't be part of image manager handling +// Added some to bookshelf controller already + use BookStack\Entities\EntityProvider; use BookStack\Entities\Repos\EntityRepo; use BookStack\Exceptions\ImageUploadException; diff --git a/app/Http/Controllers/Images/SystemImageController.php b/app/Http/Controllers/Images/SystemImageController.php index 1c4de2f70..ad3de9625 100644 --- a/app/Http/Controllers/Images/SystemImageController.php +++ b/app/Http/Controllers/Images/SystemImageController.php @@ -1,5 +1,8 @@ where('type', '=', 'user') - ->update([ - 'uploaded_to' => DB::raw('`created_by`') - ]); - - DB::table('images') - ->where('type', '=', 'cover') - ->update(['type' => 'cover_book']); - - $firstBook = DB::table('books')->first(['id']); - if ($firstBook) { - DB::table('images') - ->where('type', '=', 'cover_book') - ->update(['uploaded_to' => $firstBook->id]); - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - DB::table('images') - ->where('type', '=', 'user') - ->update([ - 'uploaded_to' => 0 - ]); - - DB::table('images') - ->where('type', '=', 'cover_book') - ->update(['type' => 'cover', 'uploaded_to' => 0]); - } -} diff --git a/resources/views/components/image-picker.blade.php b/resources/views/components/image-picker.blade.php index e7c74c786..10df50293 100644 --- a/resources/views/components/image-picker.blade.php +++ b/resources/views/components/image-picker.blade.php @@ -17,4 +17,6 @@ +{{-- TODO - Revamp to be custom file upload button, instead of being linked to image manager--}} +{{-- TODO - Remove image manager use where this is used and clean image manager for drawing/gallery use.--}} \ No newline at end of file diff --git a/resources/views/shelves/edit.blade.php b/resources/views/shelves/edit.blade.php index c51330ce0..fa8a3d63b 100644 --- a/resources/views/shelves/edit.blade.php +++ b/resources/views/shelves/edit.blade.php @@ -23,5 +23,4 @@ - @include('components.image-manager', ['imageType' => 'cover_bookshelf', 'uploaded_to' => $shelf->id]) @stop \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index cecd67456..975ab5b17 100644 --- a/routes/web.php +++ b/routes/web.php @@ -105,41 +105,25 @@ Route::group(['middleware' => 'auth'], function () { // Image routes Route::group(['prefix' => 'images'], function () { - // Get for user images -// Route::get('/user/all', 'ImageController@getAllForUserType'); -// Route::get('/user/all/{page}', 'ImageController@getAllForUserType'); - + // TODO - Check auth on these + // TODO - Maybe check types for only gallery or drawing // Standard get, update and deletion for all types Route::get('/thumb/{id}/{width}/{height}/{crop}', 'ImageController@getThumbnail'); Route::get('/base64/{id}', 'ImageController@getBase64Image'); Route::get('/usage/{id}', 'ImageController@usage'); -// Route::get('/{type}/all', 'ImageController@getAllByType'); -// Route::get('/{type}/all/{page}', 'ImageController@getAllByType'); -// Route::get('/{type}/search/{page}', 'ImageController@searchByType'); -// Route::get('/gallery/{filter}/{page}', 'ImageController@getGalleryFiltered'); // Gallery Route::get('/gallery', 'Images\GalleryImageController@list'); Route::post('/gallery', 'Images\GalleryImageController@create'); + // Drawio Route::get('/drawio', 'Images\DrawioImageController@list'); Route::post('/drawio', 'Images\DrawioImageController@create'); - // User - Route::get('/user', 'Images\UserImageController@list'); - Route::post('/user', 'Images\UserImageController@create'); - // System - Route::get('/system', 'Images\SystemImageController@list'); - Route::post('/system', 'Images\SystemImageController@create'); - // Cover - Route::get('/cover_{entity}', 'Images\CoverImageController@list'); - Route::post('/cover_{entity}', 'Images\CoverImageController@create'); - // TODO - Remove use of abstract "Type" variable (Above) - // TODO - Clearly define each endpoint so logic for each is clear - // TODO - Move into per-type controllers - // TODO - Test and fully think about permissions and each stage - Route::post('/cover', 'ImageController@uploadCoverImage'); + // TODO - Check auth on these + // TODO - Maybe check types for only gallery or drawing + // Or add to gallery/drawio controllers Route::put('/{id}', 'ImageController@update'); Route::delete('/{id}', 'ImageController@destroy'); });