image = $image; $this->file = $file; $this->imageRepo = $imageRepo; parent::__construct(); } /** * Provide an image file from storage. * @param string $path * @return mixed */ public function showImage(string $path) { $path = storage_path('uploads/images/' . $path); if (!file_exists($path)) { abort(404); } return response()->file($path); } /** * Get all images for a specific type, Paginated * @param Request $request * @param string $type * @param int $page * @return \Illuminate\Http\JsonResponse */ public function getAllByType(Request $request, $type, $page = 0) { $uploadedToFilter = $request->get('uploaded_to', null); // For user profile request, check access to user images if ($type === 'user') { $this->checkPermissionOrCurrentUser('users-manage', $uploadedToFilter ?? 0); } $imgData = $this->imageRepo->getPaginatedByType($type, $page, 24, $uploadedToFilter); return response()->json($imgData); } /** * Search through images within a particular type. * @param $type * @param int $page * @param Request $request * @return mixed */ public function searchByType(Request $request, $type, $page = 0) { $this->validate($request, [ 'term' => 'required|string' ]); $searchTerm = $request->get('term'); $imgData = $this->imageRepo->searchPaginatedByType($type, $searchTerm, $page, 24); return response()->json($imgData); } public function uploadUserImage(Request $request) { // TODO } public function uploadSystemImage(Request $request) { // TODO } public function uploadCoverImage(Request $request) { // TODO } /** * Upload a draw.io image into the system. * @param Request $request * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response */ public function uploadDrawioImage(Request $request) { $this->validate($request, [ 'image' => 'required|string', 'uploaded_to' => 'required|integer' ]); $uploadedTo = $request->get('uploaded_to', 0); $page = $this-> $this->checkPermission('image-create-all'); $imageBase64Data = $request->get('image'); try { $image = $this->imageRepo->saveDrawing($imageBase64Data, $uploadedTo); } catch (ImageUploadException $e) { return response($e->getMessage(), 500); } return response()->json($image); } /** * Handles image uploads for use on pages. * @param string $type * @param Request $request * @return \Illuminate\Http\JsonResponse * @throws \Exception */ public function uploadByType($type, Request $request) { $this->checkPermission('image-create-all'); $this->validate($request, [ 'file' => 'image_extension|no_double_extension|mimes:jpeg,png,gif,bmp,webp,tiff' ]); if (!$this->imageRepo->isValidType($type)) { return $this->jsonError(trans('errors.image_upload_type_error')); } $imageUpload = $request->file('file'); try { $uploadedTo = $request->get('uploaded_to', 0); // For user profile request, check access to user images if ($type === 'user') { $this->checkPermissionOrCurrentUser('users-manage', $uploadedTo ?? 0); } $image = $this->imageRepo->saveNew($imageUpload, $type, $uploadedTo); } catch (ImageUploadException $e) { return response($e->getMessage(), 500); } return response()->json($image); } /** * Get the content of an image based64 encoded. * @param $id * @return \Illuminate\Http\JsonResponse|mixed */ public function getBase64Image($id) { $image = $this->imageRepo->getById($id); $imageData = $this->imageRepo->getImageData($image); if ($imageData === null) { return $this->jsonError("Image data could not be found"); } return response()->json([ 'content' => base64_encode($imageData) ]); } /** * Generate a sized thumbnail for an image. * @param $id * @param $width * @param $height * @param $crop * @return \Illuminate\Http\JsonResponse * @throws ImageUploadException * @throws \Exception */ public function getThumbnail($id, $width, $height, $crop) { $this->checkPermission('image-create-all'); $image = $this->imageRepo->getById($id); $thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false'); return response()->json(['url' => $thumbnailUrl]); } /** * Update image details * @param integer $id * @param Request $request * @return \Illuminate\Http\JsonResponse * @throws ImageUploadException * @throws \Exception */ public function update($id, Request $request) { $this->validate($request, [ 'name' => 'required|min:2|string' ]); $image = $this->imageRepo->getById($id); $this->checkOwnablePermission('image-update', $image); $image = $this->imageRepo->updateImageDetails($image, $request->all()); return response()->json($image); } /** * Show the usage of an image on pages. * @param \BookStack\Entities\Repos\EntityRepo $entityRepo * @param $id * @return \Illuminate\Http\JsonResponse */ public function usage(EntityRepo $entityRepo, $id) { $image = $this->imageRepo->getById($id); $pageSearch = $entityRepo->searchForImage($image->url); return response()->json($pageSearch); } /** * Deletes an image and all thumbnail/image files * @param int $id * @return \Illuminate\Http\JsonResponse * @throws \Exception */ public function destroy($id) { $image = $this->imageRepo->getById($id); $this->checkOwnablePermission('image-delete', $image); $this->imageRepo->destroyImage($image); return response()->json(trans('components.images_deleted')); } }