diff --git a/api/app/views/spree/api/images/_image.json.jbuilder b/api/app/views/spree/api/images/_image.json.jbuilder index c6c35b59891..7045b5bdb38 100644 --- a/api/app/views/spree/api/images/_image.json.jbuilder +++ b/api/app/views/spree/api/images/_image.json.jbuilder @@ -3,5 +3,5 @@ json.(image, *image_attributes) json.(image, :viewable_type, :viewable_id) Spree::Image.attachment_definitions[:attachment][:styles].each do |key, _value| - json.set! "#{key}_url", image.attachment.url(key) + json.set! "#{key}_url", image.url(key) end diff --git a/api/spec/requests/spree/api/images_spec.rb b/api/spec/requests/spree/api/images_spec.rb index 52c6a473aa3..0a8d02d48e1 100644 --- a/api/spec/requests/spree/api/images_spec.rb +++ b/api/spec/requests/spree/api/images_spec.rb @@ -74,6 +74,17 @@ module Spree::Api expect(response.status).to eq(204) expect { product_image.reload }.to raise_error(ActiveRecord::RecordNotFound) end + + it "returns nil attribute values and noimage urls when the image cannot be found", + if: Spree::Config.image_attachment_module == Spree::Image::ActiveStorageAttachment do + product_image.attachment.blob.update(key: 11) + expect(Rails.logger).to receive(:error).with(/Image is corrupted or cannot be found/).twice + get spree.api_variant_images_path(product.master.id) + expect(response.status).to eq(200) + expect(json_response[:images].first[:attachment_width]).to be_nil + expect(json_response[:images].first[:attachment_height]).to be_nil + expect(json_response[:images].first[:product_url]).to include("noimage") + end end context 'when image belongs to another product' do diff --git a/core/app/models/concerns/spree/active_storage_adapter/attachment.rb b/core/app/models/concerns/spree/active_storage_adapter/attachment.rb index b2a63a6bc23..3ff9ecbb6a7 100644 --- a/core/app/models/concerns/spree/active_storage_adapter/attachment.rb +++ b/core/app/models/concerns/spree/active_storage_adapter/attachment.rb @@ -57,8 +57,12 @@ def destroy def metadata analyze unless analyzed? - + @attachment.metadata + rescue ActiveStorage::FileNotFoundError => error + logger.error("#{error} - Image is corrupted or cannot be found") + + { identified: nil, width: nil, height: nil, analyzed: true } end def styles_to_transformations(styles)