1 <?php namespace BookStack\Http\Controllers;
3 use BookStack\Exceptions\ImageUploadException;
4 use BookStack\Repos\ImageRepo;
5 use Illuminate\Filesystem\Filesystem as File;
6 use Illuminate\Http\Request;
8 use BookStack\Repos\PageRepo;
10 class ImageController extends Controller
17 * ImageController constructor.
20 * @param ImageRepo $imageRepo
22 public function __construct(Image $image, File $file, ImageRepo $imageRepo)
24 $this->image = $image;
26 $this->imageRepo = $imageRepo;
27 parent::__construct();
31 * Get all images for a specific type, Paginated
34 * @return \Illuminate\Http\JsonResponse
36 public function getAllByType($type, $page = 0)
38 $imgData = $this->imageRepo->getPaginatedByType($type, $page);
39 return response()->json($imgData);
43 * Search through images within a particular type.
46 * @param Request $request
49 public function searchByType($type, $page = 0, Request $request)
51 $this->validate($request, [
52 'term' => 'required|string'
55 $searchTerm = $request->get('term');
56 $imgData = $this->imageRepo->searchPaginatedByType($type, $page, 24, $searchTerm);
57 return response()->json($imgData);
61 * Get all images for a user.
63 * @return \Illuminate\Http\JsonResponse
65 public function getAllForUserType($page = 0)
67 $imgData = $this->imageRepo->getPaginatedByType('user', $page, 24, $this->currentUser->id);
68 return response()->json($imgData);
72 * Get gallery images with a specific filter such as book or page
75 * @param Request $request
76 * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response
78 public function getGalleryFiltered($filter, $page = 0, Request $request)
80 $this->validate($request, [
81 'page_id' => 'required|integer'
84 $validFilters = collect(['page', 'book']);
85 if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
87 $pageId = $request->get('page_id');
88 $imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
90 return response()->json($imgData);
94 * Handles image uploads for use on pages.
96 * @param Request $request
97 * @return \Illuminate\Http\JsonResponse
99 public function uploadByType($type, Request $request)
101 $this->checkPermission('image-create-all');
102 $this->validate($request, [
106 $imageUpload = $request->file('file');
109 $uploadedTo = $request->has('uploaded_to') ? $request->get('uploaded_to') : 0;
110 $image = $this->imageRepo->saveNew($imageUpload, $type, $uploadedTo);
111 } catch (ImageUploadException $e) {
112 return response($e->getMessage(), 500);
115 return response()->json($image);
119 * Generate a sized thumbnail for an image.
124 * @return \Illuminate\Http\JsonResponse
126 public function getThumbnail($id, $width, $height, $crop)
128 $this->checkPermission('image-create-all');
129 $image = $this->imageRepo->getById($id);
130 $thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false');
131 return response()->json(['url' => $thumbnailUrl]);
135 * Update image details
136 * @param integer $imageId
137 * @param Request $request
138 * @return \Illuminate\Http\JsonResponse
140 public function update($imageId, Request $request)
142 $this->validate($request, [
143 'name' => 'required|min:2|string'
145 $image = $this->imageRepo->getById($imageId);
146 $this->checkOwnablePermission('image-update', $image);
147 $image = $this->imageRepo->updateImageDetails($image, $request->all());
148 return response()->json($image);
152 * Deletes an image and all thumbnail/image files
153 * @param PageRepo $pageRepo
154 * @param Request $request
156 * @return \Illuminate\Http\JsonResponse
158 public function destroy(PageRepo $pageRepo, Request $request, $id)
160 $image = $this->imageRepo->getById($id);
161 $this->checkOwnablePermission('image-delete', $image);
163 // Check if this image is used on any pages
164 $isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);
166 $pageSearch = $pageRepo->searchForImage($image->url);
167 if ($pageSearch !== false) {
168 return response()->json($pageSearch, 400);
172 $this->imageRepo->destroyImage($image);
173 return response()->json(trans('components.images_deleted'));