]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/ImageController.php
1b064de01c9e6ce543977b8f2426ef5ebf0df477
[bookstack] / app / Http / Controllers / ImageController.php
1 <?php namespace BookStack\Http\Controllers;
2
3 use BookStack\Exceptions\ImageUploadException;
4 use BookStack\Repos\EntityRepo;
5 use BookStack\Repos\ImageRepo;
6 use Illuminate\Filesystem\Filesystem as File;
7 use Illuminate\Http\Request;
8 use BookStack\Image;
9 use BookStack\Repos\PageRepo;
10
11 class ImageController extends Controller
12 {
13     protected $image;
14     protected $file;
15     protected $imageRepo;
16
17     /**
18      * ImageController constructor.
19      * @param Image $image
20      * @param File $file
21      * @param ImageRepo $imageRepo
22      */
23     public function __construct(Image $image, File $file, ImageRepo $imageRepo)
24     {
25         $this->image = $image;
26         $this->file = $file;
27         $this->imageRepo = $imageRepo;
28         parent::__construct();
29     }
30
31     /**
32      * Get all images for a specific type, Paginated
33      * @param string $type
34      * @param int $page
35      * @return \Illuminate\Http\JsonResponse
36      */
37     public function getAllByType($type, $page = 0)
38     {
39         $imgData = $this->imageRepo->getPaginatedByType($type, $page);
40         return response()->json($imgData);
41     }
42
43     /**
44      * Search through images within a particular type.
45      * @param $type
46      * @param int $page
47      * @param Request $request
48      * @return mixed
49      */
50     public function searchByType($type, $page = 0, Request $request)
51     {
52         $this->validate($request, [
53             'term' => 'required|string'
54         ]);
55
56         $searchTerm = $request->get('term');
57         $imgData = $this->imageRepo->searchPaginatedByType($type, $page, 24, $searchTerm);
58         return response()->json($imgData);
59     }
60
61     /**
62      * Get all images for a user.
63      * @param int $page
64      * @return \Illuminate\Http\JsonResponse
65      */
66     public function getAllForUserType($page = 0)
67     {
68         $imgData = $this->imageRepo->getPaginatedByType('user', $page, 24, $this->currentUser->id);
69         return response()->json($imgData);
70     }
71
72     /**
73      * Get gallery images with a specific filter such as book or page
74      * @param $filter
75      * @param int $page
76      * @param Request $request
77      * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response
78      */
79     public function getGalleryFiltered($filter, $page = 0, Request $request)
80     {
81         $this->validate($request, [
82             'page_id' => 'required|integer'
83         ]);
84
85         $validFilters = collect(['page', 'book']);
86         if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
87
88         $pageId = $request->get('page_id');
89         $imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
90
91         return response()->json($imgData);
92     }
93
94     /**
95      * Handles image uploads for use on pages.
96      * @param string $type
97      * @param Request $request
98      * @return \Illuminate\Http\JsonResponse
99      * @throws \Exception
100      */
101     public function uploadByType($type, Request $request)
102     {
103         $this->checkPermission('image-create-all');
104         $this->validate($request, [
105             'file' => 'is_image'
106         ]);
107         // TODO - Restrict & validate types
108
109         $imageUpload = $request->file('file');
110
111         try {
112             $uploadedTo = $request->get('uploaded_to', 0);
113             $image = $this->imageRepo->saveNew($imageUpload, $type, $uploadedTo);
114         } catch (ImageUploadException $e) {
115             return response($e->getMessage(), 500);
116         }
117
118         return response()->json($image);
119     }
120
121     /**
122      * Upload a drawing to the system.
123      * @param Request $request
124      * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response
125      */
126     public function uploadDrawing(Request $request)
127     {
128         $this->validate($request, [
129             'image' => 'required|string',
130             'uploaded_to' => 'required|integer'
131         ]);
132         $this->checkPermission('image-create-all');
133         $imageBase64Data = $request->get('image');
134
135         try {
136             $uploadedTo = $request->get('uploaded_to', 0);
137             $image = $this->imageRepo->saveDrawing($imageBase64Data, $uploadedTo);
138         } catch (ImageUploadException $e) {
139             return response($e->getMessage(), 500);
140         }
141
142         return response()->json($image);
143     }
144
145     /**
146      * Get the content of an image based64 encoded.
147      * @param $id
148      * @return \Illuminate\Http\JsonResponse|mixed
149      */
150     public function getBase64Image($id)
151     {
152         $image = $this->imageRepo->getById($id);
153         $imageData = $this->imageRepo->getImageData($image);
154         if ($imageData === null) {
155             return $this->jsonError("Image data could not be found");
156         }
157         return response()->json([
158             'content' => base64_encode($imageData)
159         ]);
160     }
161
162     /**
163      * Generate a sized thumbnail for an image.
164      * @param $id
165      * @param $width
166      * @param $height
167      * @param $crop
168      * @return \Illuminate\Http\JsonResponse
169      * @throws ImageUploadException
170      * @throws \Exception
171      */
172     public function getThumbnail($id, $width, $height, $crop)
173     {
174         $this->checkPermission('image-create-all');
175         $image = $this->imageRepo->getById($id);
176         $thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false');
177         return response()->json(['url' => $thumbnailUrl]);
178     }
179
180     /**
181      * Update image details
182      * @param integer $imageId
183      * @param Request $request
184      * @return \Illuminate\Http\JsonResponse
185      * @throws ImageUploadException
186      * @throws \Exception
187      */
188     public function update($imageId, Request $request)
189     {
190         $this->validate($request, [
191             'name' => 'required|min:2|string'
192         ]);
193         $image = $this->imageRepo->getById($imageId);
194         $this->checkOwnablePermission('image-update', $image);
195         $image = $this->imageRepo->updateImageDetails($image, $request->all());
196         return response()->json($image);
197     }
198
199     /**
200      * Deletes an image and all thumbnail/image files
201      * @param EntityRepo $entityRepo
202      * @param Request $request
203      * @param int $id
204      * @return \Illuminate\Http\JsonResponse
205      */
206     public function destroy(EntityRepo $entityRepo, Request $request, $id)
207     {
208         $image = $this->imageRepo->getById($id);
209         $this->checkOwnablePermission('image-delete', $image);
210
211         // Check if this image is used on any pages
212         $isForced = in_array($request->get('force', ''), [true, 'true']);
213         if (!$isForced) {
214             $pageSearch = $entityRepo->searchForImage($image->url);
215             if ($pageSearch !== false) {
216                 return response()->json($pageSearch, 400);
217             }
218         }
219
220         $this->imageRepo->destroyImage($image);
221         return response()->json(trans('components.images_deleted'));
222     }
223
224
225 }