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
77 public function getGalleryFiltered($filter, $page = 0, Request $request)
79 $this->validate($request, [
80 'page_id' => 'required|integer'
83 $validFilters = collect(['page', 'book']);
84 if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
86 $pageId = $request->get('page_id');
87 $imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
89 return response()->json($imgData);
93 * Handles image uploads for use on pages.
95 * @param Request $request
96 * @return \Illuminate\Http\JsonResponse
98 public function uploadByType($type, Request $request)
100 $this->checkPermission('image-create-all');
101 $this->validate($request, [
105 $imageUpload = $request->file('file');
108 $uploadedTo = $request->has('uploaded_to') ? $request->get('uploaded_to') : 0;
109 $image = $this->imageRepo->saveNew($imageUpload, $type, $uploadedTo);
110 } catch (ImageUploadException $e) {
111 return response($e->getMessage(), 500);
114 return response()->json($image);
118 * Generate a sized thumbnail for an image.
123 * @return \Illuminate\Http\JsonResponse
125 public function getThumbnail($id, $width, $height, $crop)
127 $this->checkPermission('image-create-all');
128 $image = $this->imageRepo->getById($id);
129 $thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false');
130 return response()->json(['url' => $thumbnailUrl]);
134 * Update image details
135 * @param integer $imageId
136 * @param Request $request
137 * @return \Illuminate\Http\JsonResponse
139 public function update($imageId, Request $request)
141 $this->validate($request, [
142 'name' => 'required|min:2|string'
144 $image = $this->imageRepo->getById($imageId);
145 $this->checkOwnablePermission('image-update', $image);
146 $image = $this->imageRepo->updateImageDetails($image, $request->all());
147 return response()->json($image);
151 * Deletes an image and all thumbnail/image files
152 * @param PageRepo $pageRepo
153 * @param Request $request
155 * @return \Illuminate\Http\JsonResponse
157 public function destroy(PageRepo $pageRepo, Request $request, $id)
159 $image = $this->imageRepo->getById($id);
160 $this->checkOwnablePermission('image-delete', $image);
162 // Check if this image is used on any pages
163 $isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);
165 $pageSearch = $pageRepo->searchForImage($image->url);
166 if ($pageSearch !== false) {
167 return response()->json($pageSearch, 400);
171 $this->imageRepo->destroyImage($image);
172 return response()->json('Image Deleted');