]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/ImageController.php
Added new page drafts and started image entity attaching
[bookstack] / app / Http / Controllers / ImageController.php
1 <?php
2
3 namespace BookStack\Http\Controllers;
4
5 use BookStack\Exceptions\ImageUploadException;
6 use BookStack\Repos\ImageRepo;
7 use Illuminate\Filesystem\Filesystem as File;
8 use Illuminate\Http\Request;
9 use Illuminate\Support\Facades\Auth;
10 use Intervention\Image\Facades\Image as ImageTool;
11 use Illuminate\Support\Facades\DB;
12 use BookStack\Image;
13 use BookStack\Repos\PageRepo;
14
15 class ImageController extends Controller
16 {
17     protected $image;
18     protected $file;
19     protected $imageRepo;
20
21     /**
22      * ImageController constructor.
23      * @param Image     $image
24      * @param File      $file
25      * @param ImageRepo $imageRepo
26      */
27     public function __construct(Image $image, File $file, ImageRepo $imageRepo)
28     {
29         $this->image = $image;
30         $this->file = $file;
31         $this->imageRepo = $imageRepo;
32         parent::__construct();
33     }
34
35     /**
36      * Get all images for a specific type, Paginated
37      * @param int $page
38      * @return \Illuminate\Http\JsonResponse
39      */
40     public function getAllByType($type, $page = 0)
41     {
42         $imgData = $this->imageRepo->getPaginatedByType($type, $page);
43         return response()->json($imgData);
44     }
45
46     /**
47      * Get all images for a user.
48      * @param int $page
49      * @return \Illuminate\Http\JsonResponse
50      */
51     public function getAllForUserType($page = 0)
52     {
53         $imgData = $this->imageRepo->getPaginatedByType('user', $page, 24, $this->currentUser->id);
54         return response()->json($imgData);
55     }
56
57     /**
58      * Handles image uploads for use on pages.
59      * @param string  $type
60      * @param Request $request
61      * @return \Illuminate\Http\JsonResponse
62      */
63     public function uploadByType($type, Request $request)
64     {
65         $this->checkPermission('image-create-all');
66         $this->validate($request, [
67             'file' => 'image|mimes:jpeg,gif,png'
68         ]);
69
70         $imageUpload = $request->file('file');
71
72         try {
73             $image = $this->imageRepo->saveNew($imageUpload, $type);
74         } catch (ImageUploadException $e) {
75             return response($e->getMessage(), 500);
76         }
77
78         return response()->json($image);
79     }
80
81     /**
82      * Generate a sized thumbnail for an image.
83      * @param $id
84      * @param $width
85      * @param $height
86      * @param $crop
87      * @return \Illuminate\Http\JsonResponse
88      */
89     public function getThumbnail($id, $width, $height, $crop)
90     {
91         $this->checkPermission('image-create-all');
92         $image = $this->imageRepo->getById($id);
93         $thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false');
94         return response()->json(['url' => $thumbnailUrl]);
95     }
96
97     /**
98      * Update image details
99      * @param         $imageId
100      * @param Request $request
101      * @return \Illuminate\Http\JsonResponse
102      */
103     public function update($imageId, Request $request)
104     {
105         $this->validate($request, [
106             'name' => 'required|min:2|string'
107         ]);
108         $image = $this->imageRepo->getById($imageId);
109         $this->checkOwnablePermission('image-update', $image);
110         $image = $this->imageRepo->updateImageDetails($image, $request->all());
111         return response()->json($image);
112     }
113
114     /**
115      * Deletes an image and all thumbnail/image files
116      * @param PageRepo $pageRepo
117      * @param Request  $request
118      * @param int      $id
119      * @return \Illuminate\Http\JsonResponse
120      */
121     public function destroy(PageRepo $pageRepo, Request $request, $id)
122     {
123         $image = $this->imageRepo->getById($id);
124         $this->checkOwnablePermission('image-delete', $image);
125
126         // Check if this image is used on any pages
127         $isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);
128         if (!$isForced) {
129             $pageSearch = $pageRepo->searchForImage($image->url);
130             if ($pageSearch !== false) {
131                 return response()->json($pageSearch, 400);
132             }
133         }
134
135         $this->imageRepo->destroyImage($image);
136         return response()->json('Image Deleted');
137     }
138
139
140 }