]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/ImageController.php
Merge branch 'master' into translations
[bookstack] / app / Http / Controllers / ImageController.php
1 <?php namespace BookStack\Http\Controllers;
2
3 use BookStack\Exceptions\ImageUploadException;
4 use BookStack\Repos\ImageRepo;
5 use Illuminate\Filesystem\Filesystem as File;
6 use Illuminate\Http\Request;
7 use BookStack\Image;
8 use BookStack\Repos\PageRepo;
9
10 class ImageController extends Controller
11 {
12     protected $image;
13     protected $file;
14     protected $imageRepo;
15
16     /**
17      * ImageController constructor.
18      * @param Image $image
19      * @param File $file
20      * @param ImageRepo $imageRepo
21      */
22     public function __construct(Image $image, File $file, ImageRepo $imageRepo)
23     {
24         $this->image = $image;
25         $this->file = $file;
26         $this->imageRepo = $imageRepo;
27         parent::__construct();
28     }
29
30     /**
31      * Get all images for a specific type, Paginated
32      * @param string $type
33      * @param int $page
34      * @return \Illuminate\Http\JsonResponse
35      */
36     public function getAllByType($type, $page = 0)
37     {
38         $imgData = $this->imageRepo->getPaginatedByType($type, $page);
39         return response()->json($imgData);
40     }
41
42     /**
43      * Search through images within a particular type.
44      * @param $type
45      * @param int $page
46      * @param Request $request
47      * @return mixed
48      */
49     public function searchByType($type, $page = 0, Request $request)
50     {
51         $this->validate($request, [
52             'term' => 'required|string'
53         ]);
54
55         $searchTerm = $request->get('term');
56         $imgData = $this->imageRepo->searchPaginatedByType($type, $page, 24, $searchTerm);
57         return response()->json($imgData);
58     }
59
60     /**
61      * Get all images for a user.
62      * @param int $page
63      * @return \Illuminate\Http\JsonResponse
64      */
65     public function getAllForUserType($page = 0)
66     {
67         $imgData = $this->imageRepo->getPaginatedByType('user', $page, 24, $this->currentUser->id);
68         return response()->json($imgData);
69     }
70
71     /**
72      * Get gallery images with a specific filter such as book or page
73      * @param $filter
74      * @param int $page
75      * @param Request $request
76      * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response
77      */
78     public function getGalleryFiltered($filter, $page = 0, Request $request)
79     {
80         $this->validate($request, [
81             'page_id' => 'required|integer'
82         ]);
83
84         $validFilters = collect(['page', 'book']);
85         if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
86
87         $pageId = $request->get('page_id');
88         $imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
89
90         return response()->json($imgData);
91     }
92
93     /**
94      * Handles image uploads for use on pages.
95      * @param string $type
96      * @param Request $request
97      * @return \Illuminate\Http\JsonResponse
98      */
99     public function uploadByType($type, Request $request)
100     {
101         $this->checkPermission('image-create-all');
102         $this->validate($request, [
103             'file' => 'is_image'
104         ]);
105
106         $imageUpload = $request->file('file');
107
108         try {
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);
113         }
114
115         return response()->json($image);
116     }
117
118     /**
119      * Generate a sized thumbnail for an image.
120      * @param $id
121      * @param $width
122      * @param $height
123      * @param $crop
124      * @return \Illuminate\Http\JsonResponse
125      */
126     public function getThumbnail($id, $width, $height, $crop)
127     {
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]);
132     }
133
134     /**
135      * Update image details
136      * @param integer $imageId
137      * @param Request $request
138      * @return \Illuminate\Http\JsonResponse
139      */
140     public function update($imageId, Request $request)
141     {
142         $this->validate($request, [
143             'name' => 'required|min:2|string'
144         ]);
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);
149     }
150
151     /**
152      * Deletes an image and all thumbnail/image files
153      * @param PageRepo $pageRepo
154      * @param Request $request
155      * @param int $id
156      * @return \Illuminate\Http\JsonResponse
157      */
158     public function destroy(PageRepo $pageRepo, Request $request, $id)
159     {
160         $image = $this->imageRepo->getById($id);
161         $this->checkOwnablePermission('image-delete', $image);
162
163         // Check if this image is used on any pages
164         $isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);
165         if (!$isForced) {
166             $pageSearch = $pageRepo->searchForImage($image->url);
167             if ($pageSearch !== false) {
168                 return response()->json($pageSearch, 400);
169             }
170         }
171
172         $this->imageRepo->destroyImage($image);
173         return response()->json(trans('components.images_deleted'));
174     }
175
176
177 }