diff --git a/engines/dfc_provider/app/controllers/dfc_provider/application_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/application_controller.rb index 16a830d336..16ebe0411e 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/application_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/application_controller.rb @@ -59,5 +59,9 @@ module DfcProvider def current_ability @current_ability ||= Spree::Ability.new(current_user) end + + def import + DfcIo.import(request.body) + end end end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/offers_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/offers_controller.rb index 6be9f004c4..a40b96c0b6 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/offers_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/offers_controller.rb @@ -9,6 +9,16 @@ module DfcProvider render json: DfcIo.export(subject) end + def update + offer = import + + return head :bad_request unless offer + + OfferBuilder.apply(offer, variant) + + variant.save! + end + private def variant diff --git a/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb index 21b4c4b59d..d4142f25d6 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb @@ -48,10 +48,6 @@ module DfcProvider private - def import - DfcIo.import(request.body) - end - def variant @variant ||= current_enterprise.supplied_variants.find(params[:id]) end diff --git a/engines/dfc_provider/app/services/offer_builder.rb b/engines/dfc_provider/app/services/offer_builder.rb new file mode 100644 index 0000000000..47d7c304c8 --- /dev/null +++ b/engines/dfc_provider/app/services/offer_builder.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class OfferBuilder < DfcBuilder + def self.apply(offer, variant) + variant.on_hand = offer.stockLimitation + variant.price = offer.price + end +end diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index 24dba7201a..5bde8f23ba 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -4,7 +4,7 @@ DfcProvider::Engine.routes.draw do resources :addresses, only: [:show] resources :enterprises, only: [:show] do resources :catalog_items, only: [:index, :show, :update] - resources :offers, only: [:show] + resources :offers, only: [:show, :update] resources :supplied_products, only: [:create, :show, :update] resources :social_medias, only: [:show] end diff --git a/engines/dfc_provider/spec/requests/offers_spec.rb b/engines/dfc_provider/spec/requests/offers_spec.rb index d29146527d..5fef671cc0 100644 --- a/engines/dfc_provider/spec/requests/offers_spec.rb +++ b/engines/dfc_provider/spec/requests/offers_spec.rb @@ -32,5 +32,34 @@ describe "Offers", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: true run_test! end end + + put "Update Offer" do + consumes "application/json" + + parameter name: :offer, in: :body, schema: { + example: { + '@context': "https://www.datafoodconsortium.org", + '@id': "http://test.host/api/dfc/enterprises/10000/offers/10001", + '@type': "dfc-b:Offer", + 'dfc-b:hasPrice': 9.99, + 'dfc-b:stockLimitation': 7 + } + } + + let(:id) { variant.id } + let(:offer) { |example| + example.metadata[:operation][:parameters].first[:schema][:example] + } + + response "204", "success" do + it "updates a variant" do |example| + expect { + submit_request(example.metadata) + variant.reload + }.to change { variant.price }.to(9.99) + .and change { variant.on_hand }.to(7) + end + end + end end end diff --git a/swagger/dfc.yaml b/swagger/dfc.yaml index b791778324..6751e2ec05 100644 --- a/swagger/dfc.yaml +++ b/swagger/dfc.yaml @@ -438,6 +438,24 @@ paths: "@type": dfc-b:Offer dfc-b:hasPrice: 19.99 dfc-b:stockLimitation: 5 + put: + summary: Update Offer + parameters: [] + tags: + - Offers + responses: + '204': + description: success + requestBody: + content: + application/json: + schema: + example: + "@context": https://www.datafoodconsortium.org + "@id": http://test.host/api/dfc/enterprises/10000/offers/10001 + "@type": dfc-b:Offer + dfc-b:hasPrice: 9.99 + dfc-b:stockLimitation: 7 "/api/dfc/persons/{id}": get: summary: Show person