]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/ImageController.php
Merge branch 'diff' of git://github.com/younes0/BookStack into younes0-diff
[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      */
77     public function getGalleryFiltered($filter, $page = 0, Request $request)
78     {
79         $this->validate($request, [
80             'page_id' => 'required|integer'
81         ]);
82
83         $validFilters = collect(['page', 'book']);
84         if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
85
86         $pageId = $request->get('page_id');
87         $imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
88
89         return response()->json($imgData);
90     }
91
92     /**
93      * Handles image uploads for use on pages.
94      * @param string $type
95      * @param Request $request
96      * @return \Illuminate\Http\JsonResponse
97      */
98     public function uploadByType($type, Request $request)
99     {
100         $this->checkPermission('image-create-all');
101         $this->validate($request, [
102             'file' => 'is_image'
103         ]);
104
105         $imageUpload = $request->file('file');
106
107         try {
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);
112         }
113
114         return response()->json($image);
115     }
116
117     /**
118      * Generate a sized thumbnail for an image.
119      * @param $id
120      * @param $width
121      * @param $height
122      * @param $crop
123      * @return \Illuminate\Http\JsonResponse
124      */
125     public function getThumbnail($id, $width, $height, $crop)
126     {
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]);
131     }
132
133     /**
134      * Update image details
135      * @param integer $imageId
136      * @param Request $request
137      * @return \Illuminate\Http\JsonResponse
138      */
139     public function update($imageId, Request $request)
140     {
141         $this->validate($request, [
142             'name' => 'required|min:2|string'
143         ]);
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);
148     }
149
150     /**
151      * Deletes an image and all thumbnail/image files
152      * @param PageRepo $pageRepo
153      * @param Request $request
154      * @param int $id
155      * @return \Illuminate\Http\JsonResponse
156      */
157     public function destroy(PageRepo $pageRepo, Request $request, $id)
158     {
159         $image = $this->imageRepo->getById($id);
160         $this->checkOwnablePermission('image-delete', $image);
161
162         // Check if this image is used on any pages
163         $isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);
164         if (!$isForced) {
165             $pageSearch = $pageRepo->searchForImage($image->url);
166             if ($pageSearch !== false) {
167                 return response()->json($pageSearch, 400);
168             }
169         }
170
171         $this->imageRepo->destroyImage($image);
172         return response()->json('Image Deleted');
173     }
174
175
176 }