From 1bfd77e7a15cd52b2ccfa221ea90019438c2fbc1 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sat, 20 Jan 2018 14:01:35 +0000 Subject: [PATCH] Added drawing update ability --- app/Http/Controllers/ImageController.php | 26 ++++++++++++++++++++++++ app/Repos/ImageRepo.php | 12 +++++++++++ app/Services/ImageService.php | 25 +++++++++++++++++++++++ resources/assets/js/pages/page-form.js | 15 +++++++++++++- routes/web.php | 1 + 5 files changed, 78 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ImageController.php b/app/Http/Controllers/ImageController.php index 1b064de01..81e300a68 100644 --- a/app/Http/Controllers/ImageController.php +++ b/app/Http/Controllers/ImageController.php @@ -142,6 +142,32 @@ class ImageController extends Controller return response()->json($image); } + /** + * Replace the data content of a drawing. + * @param string $id + * @param Request $request + * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response + */ + public function replaceDrawing(string $id, Request $request) + { + $this->validate($request, [ + 'image' => 'required|string' + ]); + $this->checkPermission('image-create-all'); + + $imageBase64Data = $request->get('image'); + $image = $this->imageRepo->getById($id); + $this->checkOwnablePermission('image-update', $image); + + try { + $image = $this->imageRepo->replaceDrawingContent($image, $imageBase64Data); + } catch (ImageUploadException $e) { + return response($e->getMessage(), 500); + } + + return response()->json($image); + } + /** * Get the content of an image based64 encoded. * @param $id diff --git a/app/Repos/ImageRepo.php b/app/Repos/ImageRepo.php index 734254b3d..492834446 100644 --- a/app/Repos/ImageRepo.php +++ b/app/Repos/ImageRepo.php @@ -156,6 +156,18 @@ class ImageRepo return $image; } + /** + * Replace the image content of a drawing. + * @param Image $image + * @param string $base64Uri + * @return Image + * @throws \BookStack\Exceptions\ImageUploadException + */ + public function replaceDrawingContent(Image $image, string $base64Uri) + { + return $this->imageService->replaceImageDataFromBase64Uri($image, $base64Uri); + } + /** * Update the details of an image via an array of properties. * @param Image $image diff --git a/app/Services/ImageService.php b/app/Services/ImageService.php index 82d1acef7..1da68ddf1 100644 --- a/app/Services/ImageService.php +++ b/app/Services/ImageService.php @@ -65,6 +65,31 @@ class ImageService extends UploadService return $this->saveNew($name, $data, $type, $uploadedTo); } + /** + * Replace the data for an image via a Base64 encoded string. + * @param Image $image + * @param string $base64Uri + * @return Image + * @throws ImageUploadException + */ + public function replaceImageDataFromBase64Uri(Image $image, string $base64Uri) + { + $splitData = explode(';base64,', $base64Uri); + if (count($splitData) < 2) { + throw new ImageUploadException("Invalid base64 image data provided"); + } + $data = base64_decode($splitData[1]); + $storage = $this->getStorage(); + + try { + $storage->put($image->path, $data); + } catch (Exception $e) { + throw new ImageUploadException(trans('errors.path_not_writable', ['filePath' => $image->path])); + } + + return $image; + } + /** * Gets an image from url and saves it to the database. * @param $url diff --git a/resources/assets/js/pages/page-form.js b/resources/assets/js/pages/page-form.js index b1b9680c7..8e70d2db5 100644 --- a/resources/assets/js/pages/page-form.js +++ b/resources/assets/js/pages/page-form.js @@ -265,7 +265,20 @@ function drawIoPlugin() { uploaded_to: Number(document.getElementById('page-editor').getAttribute('page-id')) }; - // TODO - Handle updating an existing image + // Handle updating an existing image + if (currentNode) { + console.log(currentNode); + drawEventClose(); + let imgElem = currentNode.querySelector('img'); + let drawingId = currentNode.getAttribute('drawio-diagram'); + window.$http.put(window.baseUrl(`/images/drawing/upload/${drawingId}`), data).then(resp => { + pageEditor.dom.setAttrib(imgElem, 'src', `${resp.data.url}?updated=${Date.now()}`); + }).catch(err => { + window.$events.emit('error', trans('errors.image_upload_error')); + console.log(err); + }); + return; + } setTimeout(() => { pageEditor.insertContent(`
`); diff --git a/routes/web.php b/routes/web.php index 3d4db7f12..266e297f3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -89,6 +89,7 @@ Route::group(['middleware' => 'auth'], function () { Route::get('/base64/{id}', 'ImageController@getBase64Image'); Route::put('/update/{imageId}', 'ImageController@update'); Route::post('/drawing/upload', 'ImageController@uploadDrawing'); + Route::put('/drawing/upload/{id}', 'ImageController@replaceDrawing'); Route::post('/{type}/upload', 'ImageController@uploadByType'); Route::get('/{type}/all', 'ImageController@getAllByType'); Route::get('/{type}/all/{page}', 'ImageController@getAllByType');