Skip to content

Commit

Permalink
API uploads images via URL
Browse files Browse the repository at this point in the history
This enhancement give the images API the ability to create and update images from
URLs.  A simple check determines whether or not the attachment parameter is a URL.

If it is a URL: OpenURI is used to download the image and it subsequently
undergoes the standard post upload processing (via paperclip).  After
processing the image, the other attributes (besides :attachment) are updated on
the resultant Spree::Image.

If it is not a URL: the attachment parameter is handled in the same manner
it was prior to this commit.

API documentation added.

Uses static image from solidus repo, to avoid external dependency
  • Loading branch information
calebhaye committed Apr 19, 2020
1 parent 68cad80 commit 4a1824a
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 2 deletions.
25 changes: 23 additions & 2 deletions api/app/controllers/spree/api/images_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,23 @@ def show

def create
authorize! :create, Image
@image = scope.images.create(image_params)

@image = scope.images.build(image_params.except(:attachment))
@image.attachment = prepared_attachment
@image.save

respond_with(@image, status: 201, default_template: :show)
end

def update
@image = scope.images.accessible_by(current_ability, :update).find(params[:id])
@image.update(image_params)
if image_params[:attachment].present?
@image.assign_attributes(image_params.except(:attachment))
@image.attachment = prepared_attachment
@image.save
else
@image.update image_params
end
respond_with(@image, default_template: :show)
end

Expand All @@ -44,6 +54,17 @@ def scope
Spree::Variant.find(params[:variant_id])
end
end

def prepared_attachment
uri = URI.parse image_params[:attachment]
if uri.is_a? URI::HTTP
URI.open(image_params[:attachment])
else
image_params[:attachment]
end
rescue URI::InvalidURIError
image_params[:attachment]
end
end
end
end
1 change: 1 addition & 0 deletions api/openapi/api.oas2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5885,6 +5885,7 @@ definitions:
type: string
attachment:
type: string
description: 'This field can be used to pass an image URL. When used in this manner, the image undergoes the standard post upload processing via paperclip.'
position:
type: integer
viewable_type:
Expand Down
30 changes: 30 additions & 0 deletions api/spec/requests/spree/api/images_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,22 @@ module Spree
end.to change(Image, :count).by(1)
end

it 'can upload a new image from a valid URL' do
expect do
post spree.api_product_images_path(product.id), params: {
image: {
attachment: 'https://github.com/solidusio/brand/raw/1827e7afb7ebcf5a1fc9cf7bf6cf9d277183ef11/PNG/solidus-logo-dark.png',
viewable_type: 'Spree::Variant',
viewable_id: product.master.to_param,
alt: 'just a test'
},
}
expect(response.status).to eq(201)
expect(json_response).to have_attributes(attributes)
expect(json_response[:alt]).to eq('just a test')
end.to change(Image, :count).by(1)
end

context "working with an existing product image" do
let!(:product_image) { product.master.images.create!(attachment: image('thinking-cat.jpg')) }

Expand Down Expand Up @@ -69,6 +85,20 @@ module Spree
expect(product_image.reload.position).to eq(2)
end

it "can update image URL" do
expect(product_image.position).to eq(1)
put spree.api_variant_image_path(product.master.id, product_image), params: {
image: {
position: 2,
attachment: 'https://github.com/solidusio/brand/raw/1827e7afb7ebcf5a1fc9cf7bf6cf9d277183ef11/PNG/solidus-logo-dark.png'
},
}
expect(response.status).to eq(200)
expect(json_response).to have_attributes(attributes)
expect(product_image.reload.position).to eq(2)
expect(product_image.reload.attachment_height).to eq(420)
end

it "can delete an image" do
delete spree.api_variant_image_path(product.master.id, product_image)
expect(response.status).to eq(204)
Expand Down

0 comments on commit 4a1824a

Please sign in to comment.