X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/968bc8cdf354d9cbe29b88abdc747a7845031fab..refs/pull/5280/head:/app/Entities/Controllers/BookshelfApiController.php diff --git a/app/Entities/Controllers/BookshelfApiController.php b/app/Entities/Controllers/BookshelfApiController.php index 9bdb8256d..a665bcb6b 100644 --- a/app/Entities/Controllers/BookshelfApiController.php +++ b/app/Entities/Controllers/BookshelfApiController.php @@ -3,6 +3,7 @@ namespace BookStack\Entities\Controllers; use BookStack\Entities\Models\Bookshelf; +use BookStack\Entities\Queries\BookshelfQueries; use BookStack\Entities\Repos\BookshelfRepo; use BookStack\Http\ApiController; use Exception; @@ -12,11 +13,10 @@ use Illuminate\Validation\ValidationException; class BookshelfApiController extends ApiController { - protected BookshelfRepo $bookshelfRepo; - - public function __construct(BookshelfRepo $bookshelfRepo) - { - $this->bookshelfRepo = $bookshelfRepo; + public function __construct( + protected BookshelfRepo $bookshelfRepo, + protected BookshelfQueries $queries, + ) { } /** @@ -24,7 +24,9 @@ class BookshelfApiController extends ApiController */ public function list() { - $shelves = Bookshelf::visible(); + $shelves = $this->queries + ->visibleForList() + ->addSelect(['created_by', 'updated_by']); return $this->apiListingResponse($shelves, [ 'id', 'name', 'slug', 'description', 'created_at', 'updated_at', 'created_by', 'updated_by', 'owned_by', @@ -48,7 +50,7 @@ class BookshelfApiController extends ApiController $bookIds = $request->get('books', []); $shelf = $this->bookshelfRepo->create($requestData, $bookIds); - return response()->json($shelf); + return response()->json($this->forJsonDisplay($shelf)); } /** @@ -56,12 +58,14 @@ class BookshelfApiController extends ApiController */ public function read(string $id) { - $shelf = Bookshelf::visible()->with([ - 'tags', 'cover', 'createdBy', 'updatedBy', 'ownedBy', + $shelf = $this->queries->findVisibleByIdOrFail(intval($id)); + $shelf = $this->forJsonDisplay($shelf); + $shelf->load([ + 'createdBy', 'updatedBy', 'ownedBy', 'books' => function (BelongsToMany $query) { $query->scopes('visible')->get(['id', 'name', 'slug']); }, - ])->findOrFail($id); + ]); return response()->json($shelf); } @@ -78,7 +82,7 @@ class BookshelfApiController extends ApiController */ public function update(Request $request, string $id) { - $shelf = Bookshelf::visible()->findOrFail($id); + $shelf = $this->queries->findVisibleByIdOrFail(intval($id)); $this->checkOwnablePermission('bookshelf-update', $shelf); $requestData = $this->validate($request, $this->rules()['update']); @@ -86,7 +90,7 @@ class BookshelfApiController extends ApiController $shelf = $this->bookshelfRepo->update($shelf, $requestData, $bookIds); - return response()->json($shelf); + return response()->json($this->forJsonDisplay($shelf)); } /** @@ -97,7 +101,7 @@ class BookshelfApiController extends ApiController */ public function delete(string $id) { - $shelf = Bookshelf::visible()->findOrFail($id); + $shelf = $this->queries->findVisibleByIdOrFail(intval($id)); $this->checkOwnablePermission('bookshelf-delete', $shelf); $this->bookshelfRepo->destroy($shelf); @@ -105,22 +109,36 @@ class BookshelfApiController extends ApiController return response('', 204); } + protected function forJsonDisplay(Bookshelf $shelf): Bookshelf + { + $shelf = clone $shelf; + $shelf->unsetRelations()->refresh(); + + $shelf->load(['tags', 'cover']); + $shelf->makeVisible('description_html') + ->setAttribute('description_html', $shelf->descriptionHtml()); + + return $shelf; + } + protected function rules(): array { return [ 'create' => [ - 'name' => ['required', 'string', 'max:255'], - 'description' => ['string', 'max:1000'], - 'books' => ['array'], - 'tags' => ['array'], - 'image' => array_merge(['nullable'], $this->getImageValidationRules()), + 'name' => ['required', 'string', 'max:255'], + 'description' => ['string', 'max:1900'], + 'description_html' => ['string', 'max:2000'], + 'books' => ['array'], + 'tags' => ['array'], + 'image' => array_merge(['nullable'], $this->getImageValidationRules()), ], 'update' => [ - 'name' => ['string', 'min:1', 'max:255'], - 'description' => ['string', 'max:1000'], - 'books' => ['array'], - 'tags' => ['array'], - 'image' => array_merge(['nullable'], $this->getImageValidationRules()), + 'name' => ['string', 'min:1', 'max:255'], + 'description' => ['string', 'max:1900'], + 'description_html' => ['string', 'max:2000'], + 'books' => ['array'], + 'tags' => ['array'], + 'image' => array_merge(['nullable'], $this->getImageValidationRules()), ], ]; }