diff --git a/app/Uploads/Controllers/ImageGalleryApiController.php b/app/Uploads/Controllers/ImageGalleryApiController.php index 1614b6445..4fca6a4dd 100644 --- a/app/Uploads/Controllers/ImageGalleryApiController.php +++ b/app/Uploads/Controllers/ImageGalleryApiController.php @@ -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)); } diff --git a/app/Uploads/ImageRepo.php b/app/Uploads/ImageRepo.php index e28e7b794..cdd5485ac 100644 --- a/app/Uploads/ImageRepo.php +++ b/app/Uploads/ImageRepo.php @@ -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); diff --git a/tests/Api/ImageGalleryApiTest.php b/tests/Api/ImageGalleryApiTest.php index 17c90518c..067173a6b 100644 --- a/tests/Api/ImageGalleryApiTest.php +++ b/tests/Api/ImageGalleryApiTest.php @@ -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);