]> BookStack Code Mirror - bookstack/commitdiff
Image update API: added update image file ability
authorDan Brown <redacted>
Mon, 29 May 2023 14:06:17 +0000 (15:06 +0100)
committerDan Brown <redacted>
Mon, 29 May 2023 14:06:17 +0000 (15:06 +0100)
app/Uploads/Controllers/ImageGalleryApiController.php
app/Uploads/ImageRepo.php
tests/Api/ImageGalleryApiTest.php

index 1614b64450ef151720dca38a19e038deec81b4d0..4fca6a4dd7d2fe28cacfd0f5227a21399b9100a7 100644 (file)
@@ -30,6 +30,7 @@ class ImageGalleryApiController extends ApiController
             ],
             'update' => [
                 'name'  => ['string', 'max:180'],
+                'image' => ['file', ...$this->getImageValidationRules()],
             ]
         ];
     }
@@ -89,7 +90,8 @@ class ImageGalleryApiController extends ApiController
 
     /**
      * Update the details of an existing image in the system.
-     * Only allows updating of the image name at this time.
+     * Since "image" is expected to be a file, this needs to be a 'multipart/form-data' type request if providing a
+     * new image file. Updated image files should be of the same file type as the original image.
      */
     public function update(Request $request, string $id)
     {
@@ -99,6 +101,9 @@ class ImageGalleryApiController extends ApiController
         $this->checkOwnablePermission('image-update', $image);
 
         $this->imageRepo->updateImageDetails($image, $data);
+        if (isset($data['image'])) {
+            $this->imageRepo->updateImageFile($image, $data['image']);
+        }
 
         return response()->json($this->formatForSingleResponse($image));
     }
index e28e7b794ba50ed2ca1caad5b8f1d9989f04aaad..cdd5485acc127845670792f2128ac816a989e231 100644 (file)
@@ -175,6 +175,7 @@ class ImageRepo
             throw new ImageUploadException(trans('errors.image_upload_replace_type'));
         }
 
+        $image->refresh();
         $image->updated_by = user()->id;
         $image->save();
         $this->imageService->replaceExistingFromUpload($image->path, $image->type, $file);
index 17c90518ce6fcc9481ebbc10f1cbfefad00ef8e9..067173a6b7d8260a276bf2156fea10bd4bcc8d7c 100644 (file)
@@ -295,7 +295,24 @@ class ImageGalleryApiTest extends TestCase
         ]);
     }
 
-    public function test_update_endpoint_requires_image_delete_permission()
+    public function test_update_existing_image_file()
+    {
+        $this->actingAsApiAdmin();
+        $imagePage = $this->entities->page();
+        $data = $this->files->uploadGalleryImageToPage($this, $imagePage);
+        $image = Image::findOrFail($data['response']->id);
+
+        $this->assertFileEquals($this->files->testFilePath('test-image.png'), public_path($data['path']));
+
+        $resp = $this->call('PUT', $this->baseEndpoint . "/{$image->id}", [], [], [
+            'image' => $this->files->uploadedImage('my-cool-image.png', 'compressed.png'),
+        ]);
+
+        $resp->assertStatus(200);
+        $this->assertFileEquals($this->files->testFilePath('compressed.png'), public_path($data['path']));
+    }
+
+    public function test_update_endpoint_requires_image_update_permission()
     {
         $user = $this->users->editor();
         $this->actingAsForApi($user);