]> BookStack Code Mirror - bookstack/commitdiff
Added drawing update ability
authorDan Brown <redacted>
Sat, 20 Jan 2018 14:01:35 +0000 (14:01 +0000)
committerDan Brown <redacted>
Sat, 20 Jan 2018 14:01:35 +0000 (14:01 +0000)
app/Http/Controllers/ImageController.php
app/Repos/ImageRepo.php
app/Services/ImageService.php
resources/assets/js/pages/page-form.js
routes/web.php

index 1b064de01c9e6ce543977b8f2426ef5ebf0df477..81e300a68c9950c6060860620bfe9179a04087de 100644 (file)
@@ -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
index 734254b3d1348ede6d8c069c841c4635e6634c54..492834446262d115a5a23ee38a44baa652ba3f9c 100644 (file)
@@ -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
index 82d1acef7b28c703992fc2e3b5708ddfe882b89d..1da68ddf1829e599d1e893d622009598dfde2320 100644 (file)
@@ -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
index b1b9680c7790d5c40e61ff4cc440b7ed13cca1d8..8e70d2db589cb2a340bfbe72539ea4232d03c977 100644 (file)
@@ -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(`<div drawio-diagram contenteditable="false"><img src="${loadingImage}" id="${id}"></div>`);
index 3d4db7f121a043ef4c989a96421a6291425551aa..266e297f38f23f4d5f61407c07c3341566bcbbe5 100644 (file)
@@ -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');
Morty Proxy This is a proxified and sanitized view of the page, visit original site.