]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/ImageController.php
Upgraded to Laravel 5.4
[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      */
100     public function uploadByType($type, Request $request)
101     {
102         $this->checkPermission('image-create-all');
103         $this->validate($request, [
104             'file' => 'is_image'
105         ]);
106
107         $imageUpload = $request->file('file');
108
109         try {
110             $uploadedTo = $request->has('uploaded_to') ? $request->get('uploaded_to') : 0;
111             $image = $this->imageRepo->saveNew($imageUpload, $type, $uploadedTo);
112         } catch (ImageUploadException $e) {
113             return response($e->getMessage(), 500);
114         }
115
116         return response()->json($image);
117     }
118
119     /**
120      * Generate a sized thumbnail for an image.
121      * @param $id
122      * @param $width
123      * @param $height
124      * @param $crop
125      * @return \Illuminate\Http\JsonResponse
126      */
127     public function getThumbnail($id, $width, $height, $crop)
128     {
129         $this->checkPermission('image-create-all');
130         $image = $this->imageRepo->getById($id);
131         $thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false');
132         return response()->json(['url' => $thumbnailUrl]);
133     }
134
135     /**
136      * Update image details
137      * @param integer $imageId
138      * @param Request $request
139      * @return \Illuminate\Http\JsonResponse
140      */
141     public function update($imageId, Request $request)
142     {
143         $this->validate($request, [
144             'name' => 'required|min:2|string'
145         ]);
146         $image = $this->imageRepo->getById($imageId);
147         $this->checkOwnablePermission('image-update', $image);
148         $image = $this->imageRepo->updateImageDetails($image, $request->all());
149         return response()->json($image);
150     }
151
152     /**
153      * Deletes an image and all thumbnail/image files
154      * @param EntityRepo $entityRepo
155      * @param Request $request
156      * @param int $id
157      * @return \Illuminate\Http\JsonResponse
158      */
159     public function destroy(EntityRepo $entityRepo, Request $request, $id)
160     {
161         $image = $this->imageRepo->getById($id);
162         $this->checkOwnablePermission('image-delete', $image);
163
164         // Check if this image is used on any pages
165         $isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);
166         if (!$isForced) {
167             $pageSearch = $entityRepo->searchForImage($image->url);
168             if ($pageSearch !== false) {
169                 return response()->json($pageSearch, 400);
170             }
171         }
172
173         $this->imageRepo->destroyImage($image);
174         return response()->json(trans('components.images_deleted'));
175     }
176
177
178 }