From 21fc14a9fe9af3c6b5e2c4a4e3997a9e69b494f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Fri, 17 Jul 2020 14:57:34 +0200 Subject: [PATCH 01/23] Use a better products list for catalog --- .../app/controllers/dfc_provider/api/products_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb index 54c5bd4556..c35da75286 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb @@ -15,8 +15,8 @@ module DfcProvider def index products = @enterprise. - inventory_variants. - includes(:product, :inventory_items) + supplied_products. + includes(variants: :product) serialized_data = ::DfcProvider::ProductSerializer. new(products, base_url). From 9f02ee38742a6962c6b5e56ecb4f05b3a50a17fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 22 Jul 2020 12:02:49 +0200 Subject: [PATCH 02/23] Use new serialization --- .../dfc_provider/product_serializer.rb | 78 ++++++++++++++++--- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb index 42749a3d8d..d88a415268 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb @@ -13,25 +13,85 @@ module DfcProvider { "@context" => { - "DFC" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", + "dfc" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", "@base" => @base_url }, - "@id" => "/enterprise/products", - "DFC:supplies" => serialized_products + "@id" => "/enterprise/default/products", + "@id" => "/personId", + "@type"=> "dfc:Person", + "dfc:familyName" => "Doe", + "dfc:firtsName" => "Jhon", + "dfc:hasAdress" => { + "@type" => "dfc:Address", + "dfc:city" =>"", + "dfc:country" =>"", + "dfc:postcode" => "", + "dfc:street" => "" + }, + "dfc:affiliates" => [ + { + "@id" => "/entrepriseId", + "@type" => "dfc:Entreprise", + "dfc:VATnumber" => "", + "dfc:defines" => [], + "dfc:supplies" => supplied_products, + "dfc:manages" => managed_products + } + ] } end private - def serialized_products - @products.map do |variant| + def supplied_products + @products.map do |product| + variant = product.variants.first { - "DFC:description" => variant.name, - "DFC:quantity" => variant.total_on_hand, - "@id" => variant.id, - "DFC:hasUnit" => { "@id" => "/unit/#{variant.unit_description.presence || 'piece'}" } + "@id" => "/products/#{product.id}", + "dfc:hasUnit":{ + "@id" => "/unit/#{variant.unit_description.presence || 'piece'}", + "rdfs:label" => "#{variant.unit_description.presence || 'piece'}" + }, + "dfc:quantity" => "99.99", + "dfc:description" => product.name, + "dfc:totalTheoriticalStock" => nil, + "dfc:brand" => '', + "dfc:claim" => '', + "dfc:image" => product.images.first.try(:attahcement, :url), + "lifeTime" => "supply lifeTime", + "dfc:physicalCharacterisctics" => "supply physical characterisctics", + "dfc:quantity" => "supply quantity" } end end + + def managed_products + @products.map do |product| + product.variants.map do |variant| + { + "@id" => "/catalogItemId1", + "@type" => "dfc:CatalogItem", + "dfc:references" => { + "@type" => "@id", + "@id" => "/suppliedProduct/item3" + }, + "dfc:sku" => product.sku, + "dfc:stockLimitation" => nil, + "dfc:offeredThrough" => [ + { + "@id" => "offerId1", + "@type" => "dfc:Offer", + "dfc:offeresTo" => { + "@type" => "@id", + "@id" => "/customerCategoryId1" + }, + "dfc:price" => variant.price, + "dfc:stockLimitation" => 0, + } + ] + } + end + end.flatten + end end end From 645b4a9505844744e52f8c8a9bb0dcbd57c37b00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 22 Jul 2020 22:44:19 +0200 Subject: [PATCH 03/23] Use multiple serializers --- .../dfc_provider/api/products_controller.rb | 24 +++-- .../dfc_provider/catalog_item_serializer.rb | 33 +++++++ .../dfc_provider/enterprise_serializer.rb | 44 +++++++++ .../dfc_provider/offer_serializer.rb | 24 +++++ .../dfc_provider/person_serializer.rb | 36 +++++++ .../dfc_provider/product_serializer.rb | 97 ------------------- .../supplied_product_serializer.rb | 29 ++++++ 7 files changed, 177 insertions(+), 110 deletions(-) create mode 100644 engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb create mode 100644 engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb create mode 100644 engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb create mode 100644 engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb delete mode 100644 engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb create mode 100644 engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb index c35da75286..4cd256ef9f 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb @@ -14,15 +14,7 @@ module DfcProvider respond_to :json def index - products = @enterprise. - supplied_products. - includes(variants: :product) - - serialized_data = ::DfcProvider::ProductSerializer. - new(products, base_url). - serialized_data - - render json: serialized_data + render json: serialized_data_for(@user) end private @@ -54,10 +46,6 @@ module DfcProvider head :unauthorized end - def base_url - "#{root_url}api/dfc_provider" - end - def access_token request.headers['Authorization'].to_s.split(' ').last end @@ -65,6 +53,16 @@ module DfcProvider def authorization_control DfcProvider::AuthorizationControl.new(access_token) end + + def serialized_data_for(user) + { + "@context" => + { + "dfc" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", + "@base" => "#{root_url}api/dfc_provider" + } + }.merge(DfcProvider::PersonSerializer.new(user).serialized_data) + end end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb new file mode 100644 index 0000000000..47be0dd5b4 --- /dev/null +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +# Serializer used to render a DFC CatalogItemt from an OFN Product +# into JSON-LD format based on DFC ontology +module DfcProvider + class CatalogItemSerializer + def initialize(variant) + @variant = variant + end + + def serialized_data + { + "@id" => "/catalog_items/#{@variant.id}", + "@type" => "dfc:CatalogItem", + "dfc:references" => { + "@type" => "@id", + "@id" => "/supplied_products/#{@variant.product_id}" + }, + "dfc:sku" => @variant.sku, + "dfc:stockLimitation" => nil, + "dfc:offeredThrough" => serialized_offers + } + end + + private + + def serialized_offers + [ + OfferSerializer.new(@variant).serialized_data + ] + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb new file mode 100644 index 0000000000..93b5a7f732 --- /dev/null +++ b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +# Serializer used to render a DFC Enterprise from an OFN Enterprise +# into JSON-LD format based on DFC ontology +module DfcProvider + class EnterpriseSerializer + def initialize(enterprise) + @enterprise = enterprise + end + + def serialized_data + { + "@id" => "/entrepriseId", + "@type" => "dfc:Entreprise", + "dfc:VATnumber" => nil, + "dfc:defines" => [], + "dfc:supplies" => serialized_supplied_products, + "dfc:manages" => serialized_catalog_items + } + end + + private + + def products + @products ||= @enterprise. + supplied_products. + includes(variants: :product) + end + + def serialized_supplied_products + products.map do |product| + SuppliedProductSerializer.new(product).serialized_data + end + end + + def serialized_catalog_items + @products.map do |product| + product.variants.map do |variant| + CatalogItemSerializer.new(variant).serialized_data + end + end.flatten + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb new file mode 100644 index 0000000000..008df0ec19 --- /dev/null +++ b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +# Serializer used to render the DFC Offer from an OFN Product +# into JSON-LD format based on DFC ontology +module DfcProvider + class OfferSerializer + def initialize(variant) + @variant = variant + end + + def serialized_data + { + "@id" => "offers/#{@variant.id}", + "@type" => "dfc:Offer", + "dfc:offeresTo" => { + "@type" => "@id", + "@id" => "/customerCategoryId1" + }, + "dfc:price" => @variant.price, + "dfc:stockLimitation" => @variant.total_on_hand, + } + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb new file mode 100644 index 0000000000..9f4f8f3737 --- /dev/null +++ b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +# Serializer used to render the DFC Person from an OFN User +# into JSON-LD format based on DFC ontology +module DfcProvider + class PersonSerializer + def initialize(user) + @user = user + end + + def serialized_data + { + "@id" => "/personId/#{@user.id}", + "@type" => "dfc:Person", + "dfc:familyName" => @user.login, + "dfc:firtsName" => @user.email, + "dfc:hasAdress" => { + "@type" => "dfc:Address", + "dfc:city" => "", + "dfc:country" => "", + "dfc:postcode" =>"", + "dfc:street" => "" + }, + "dfc:affiliates" => affiliates_serialized_data + } + end + + private + + def affiliates_serialized_data + @user.enterprises.each do |enterprise| + EnterpriseSerializer.new(enterprise).serialized_data + end + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb deleted file mode 100644 index d88a415268..0000000000 --- a/engines/dfc_provider/app/serializers/dfc_provider/product_serializer.rb +++ /dev/null @@ -1,97 +0,0 @@ -# frozen_string_literal: true - -# Serializer used to render the products passed -# into JSON-LD format based on DFC ontology -module DfcProvider - class ProductSerializer - def initialize(products, base_url) - @products = products - @base_url = base_url - end - - def serialized_data - { - "@context" => - { - "dfc" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", - "@base" => @base_url - }, - "@id" => "/enterprise/default/products", - "@id" => "/personId", - "@type"=> "dfc:Person", - "dfc:familyName" => "Doe", - "dfc:firtsName" => "Jhon", - "dfc:hasAdress" => { - "@type" => "dfc:Address", - "dfc:city" =>"", - "dfc:country" =>"", - "dfc:postcode" => "", - "dfc:street" => "" - }, - "dfc:affiliates" => [ - { - "@id" => "/entrepriseId", - "@type" => "dfc:Entreprise", - "dfc:VATnumber" => "", - "dfc:defines" => [], - "dfc:supplies" => supplied_products, - "dfc:manages" => managed_products - } - ] - } - end - - private - - def supplied_products - @products.map do |product| - variant = product.variants.first - { - "@id" => "/products/#{product.id}", - "dfc:hasUnit":{ - "@id" => "/unit/#{variant.unit_description.presence || 'piece'}", - "rdfs:label" => "#{variant.unit_description.presence || 'piece'}" - }, - "dfc:quantity" => "99.99", - "dfc:description" => product.name, - "dfc:totalTheoriticalStock" => nil, - "dfc:brand" => '', - "dfc:claim" => '', - "dfc:image" => product.images.first.try(:attahcement, :url), - "lifeTime" => "supply lifeTime", - "dfc:physicalCharacterisctics" => "supply physical characterisctics", - "dfc:quantity" => "supply quantity" - } - end - end - - def managed_products - @products.map do |product| - product.variants.map do |variant| - { - "@id" => "/catalogItemId1", - "@type" => "dfc:CatalogItem", - "dfc:references" => { - "@type" => "@id", - "@id" => "/suppliedProduct/item3" - }, - "dfc:sku" => product.sku, - "dfc:stockLimitation" => nil, - "dfc:offeredThrough" => [ - { - "@id" => "offerId1", - "@type" => "dfc:Offer", - "dfc:offeresTo" => { - "@type" => "@id", - "@id" => "/customerCategoryId1" - }, - "dfc:price" => variant.price, - "dfc:stockLimitation" => 0, - } - ] - } - end - end.flatten - end - end -end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb new file mode 100644 index 0000000000..1d051874c1 --- /dev/null +++ b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +# Serializer used to render a DFC SuppliedProduct from an OFN Product +# into JSON-LD format based on DFC ontology +module DfcProvider + class SuppliedProductSerializer + def initialize(product) + @product = product + end + + def serialized_data + { + "@id" => "/products/#{@product.id}", + "dfc:hasUnit" => { + "@id" => "/unit/#{@product.unit_description.presence || 'piece'}", + "rdfs:label" => "#{@product.unit_description.presence || 'piece'}" + }, + "dfc:quantity" => @product.total_on_hand, + "dfc:description" => @product.name, + "dfc:totalTheoriticalStock" => nil, + "dfc:brand" => nil, + "dfc:claim" => nil, + "dfc:image" => @product.images.first.try(:attachment, :url), + "lifeTime" => nil, + "dfc:physicalCharacterisctics" => nil + } + end + end +end From 2549d454abf51dcc8c6a702e4441940c37f72449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 23 Jul 2020 09:28:07 +0200 Subject: [PATCH 04/23] Maintain specs --- .../dfc_provider/enterprise_serializer.rb | 2 +- .../dfc_provider/person_serializer.rb | 10 +++---- .../api/products_controller_spec.rb | 28 ++++++++++--------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb index 93b5a7f732..bb4efe97bc 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb @@ -10,7 +10,7 @@ module DfcProvider def serialized_data { - "@id" => "/entrepriseId", + "@id" => "/entreprises/#{@enterprise.id}", "@type" => "dfc:Entreprise", "dfc:VATnumber" => nil, "dfc:defines" => [], diff --git a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb index 9f4f8f3737..04c1a28f9f 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb @@ -16,10 +16,10 @@ module DfcProvider "dfc:firtsName" => @user.email, "dfc:hasAdress" => { "@type" => "dfc:Address", - "dfc:city" => "", - "dfc:country" => "", - "dfc:postcode" =>"", - "dfc:street" => "" + "dfc:city" => nil, + "dfc:country" => nil, + "dfc:postcode" => nil, + "dfc:street" => nil }, "dfc:affiliates" => affiliates_serialized_data } @@ -28,7 +28,7 @@ module DfcProvider private def affiliates_serialized_data - @user.enterprises.each do |enterprise| + @user.enterprises.map do |enterprise| EnterpriseSerializer.new(enterprise).serialized_data end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb index 6bbf9a1ab9..e2dee42dd1 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb @@ -5,15 +5,9 @@ require 'spec_helper' describe DfcProvider::Api::ProductsController, type: :controller do render_views - let(:user) { create(:user) } - let(:enterprise) { create(:distributor_enterprise, owner: user) } - let(:product) { create(:simple_product, supplier: enterprise ) } - let!(:visible_inventory_item) do - create(:inventory_item, - enterprise: enterprise, - variant: product.variants.first, - visible: true) - end + let!(:user) { create(:user) } + let!(:enterprise) { create(:distributor_enterprise, owner: user) } + let!(:product) { create(:simple_product, supplier: enterprise ) } describe('.index') do context 'with authorization token' do @@ -37,9 +31,13 @@ describe DfcProvider::Api::ProductsController, type: :controller do expect(response.status).to eq 200 end - it 'renders the related product' do + it 'renders the required content' do expect(response.body) - .to include(product.variants.first.name) + .to include(product.name) + expect(response.body) + .to include(user.email) + expect(response.body) + .to include("offers/#{product.variants.first.id}") end end @@ -60,9 +58,13 @@ describe DfcProvider::Api::ProductsController, type: :controller do expect(response.status).to eq 200 end - it 'renders the related product' do + it 'renders the required content' do expect(response.body) - .to include(product.variants.first.name) + .to include(product.name) + expect(response.body) + .to include(user.email) + expect(response.body) + .to include("offers/#{product.variants.first.id}") end end end From 8687e0199dec2981ad9205cf91eb5027420851d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Tue, 4 Aug 2020 15:32:24 +0200 Subject: [PATCH 05/23] Apply cosmetics --- .../dfc_provider/catalog_item_serializer.rb | 2 +- .../dfc_provider/enterprise_serializer.rb | 7 ++++--- .../app/serializers/dfc_provider/offer_serializer.rb | 2 +- .../dfc_provider/supplied_product_serializer.rb | 12 +++++++++--- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index 47be0dd5b4..4733730004 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Serializer used to render a DFC CatalogItemt from an OFN Product +# Serializer used to render a DFC CatalogItem from an OFN Product # into JSON-LD format based on DFC ontology module DfcProvider class CatalogItemSerializer diff --git a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb index bb4efe97bc..2afebb6ecf 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb @@ -22,9 +22,10 @@ module DfcProvider private def products - @products ||= @enterprise. - supplied_products. - includes(variants: :product) + @products ||= + @enterprise. + supplied_products. + includes(variants: :product) end def serialized_supplied_products diff --git a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb index 008df0ec19..1ecd072fb6 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb @@ -17,7 +17,7 @@ module DfcProvider "@id" => "/customerCategoryId1" }, "dfc:price" => @variant.price, - "dfc:stockLimitation" => @variant.total_on_hand, + "dfc:stockLimitation" => @variant.on_hand, } end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb index 1d051874c1..7b05fbd827 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb @@ -12,10 +12,10 @@ module DfcProvider { "@id" => "/products/#{@product.id}", "dfc:hasUnit" => { - "@id" => "/unit/#{@product.unit_description.presence || 'piece'}", - "rdfs:label" => "#{@product.unit_description.presence || 'piece'}" + "@id" => "/unit/#{unit_name}", + "rdfs:label" => unit_name }, - "dfc:quantity" => @product.total_on_hand, + "dfc:quantity" => @product.on_hand, "dfc:description" => @product.name, "dfc:totalTheoriticalStock" => nil, "dfc:brand" => nil, @@ -25,5 +25,11 @@ module DfcProvider "dfc:physicalCharacterisctics" => nil } end + + private + + def unit_name + @product.unit_description.presence || 'piece' + end end end From 2a8268ca73f6e6a645c443086678b72d0fef7030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 12 Aug 2020 12:24:31 +0200 Subject: [PATCH 06/23] Use ActiveModelSerializer for DFC serialization --- Gemfile.lock | 1 + .../dfc_provider/api/products_controller.rb | 16 ++--- .../dfc_provider/address_serializer.rb | 22 +++++++ .../dfc_provider/catalog_item_serializer.rb | 44 +++++++------ .../dfc_provider/enterprise_serializer.rb | 58 +++++++++-------- .../dfc_provider/offer_serializer.rb | 36 +++++++---- .../dfc_provider/person_serializer.rb | 46 +++++++------- .../supplied_product_serializer.rb | 62 +++++++++++++------ engines/dfc_provider/dfc_provider.gemspec | 1 + .../api/products_controller_spec.rb | 4 +- 10 files changed, 182 insertions(+), 108 deletions(-) create mode 100644 engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb diff --git a/Gemfile.lock b/Gemfile.lock index 422ecd984c..8953d817d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -64,6 +64,7 @@ PATH remote: engines/dfc_provider specs: dfc_provider (0.0.1) + active_model_serializers (~> 0.8.4) jwt (~> 2.2) rspec (~> 3.9) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb index 4cd256ef9f..25c01db68d 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb @@ -14,7 +14,10 @@ module DfcProvider respond_to :json def index - render json: serialized_data_for(@user) + render json: @user, + serializer: DfcProvider::PersonSerializer, + meta: meta_data, + meta_key: '@context' end private @@ -54,14 +57,11 @@ module DfcProvider DfcProvider::AuthorizationControl.new(access_token) end - def serialized_data_for(user) + def meta_data { - "@context" => - { - "dfc" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", - "@base" => "#{root_url}api/dfc_provider" - } - }.merge(DfcProvider::PersonSerializer.new(user).serialized_data) + "dfc" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", + "@base" => "#{root_url}api/dfc_provider" + } end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb new file mode 100644 index 0000000000..efa717298e --- /dev/null +++ b/engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +# Serializer used to render the DFC Address from an OFN User +# into JSON-LD format based on DFC ontology +module DfcProvider + class AddressSerializer < ActiveModel::Serializer + attribute :type, key: '@type' + attribute :city, key: 'dfc:city' + attribute :country, key: 'dfc:country' + attribute :postcode, key: 'dfc:postcode' + attribute :street, key: 'dfc:street' + + def type + 'dfc:Address' + end + + def city; end + def country; end + def postcode; end + def street; end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index 4733730004..41dcf57572 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -3,31 +3,39 @@ # Serializer used to render a DFC CatalogItem from an OFN Product # into JSON-LD format based on DFC ontology module DfcProvider - class CatalogItemSerializer - def initialize(variant) - @variant = variant + class CatalogItemSerializer < ActiveModel::Serializer + attribute :id, key: '@id' + attribute :type, key: '@type' + attribute :references, key: 'dfc:references' + attribute :sku, key: 'dfc:sku' + attribute :stock_limitation, key: 'dfc:stockLimitation' + has_many :offered_through, + serializer: DfcProvider::OfferSerializer, + key: 'dfc:offeredThrough' + + def id + "/catalog_items/#{object.id}" end - def serialized_data + def type + 'dfc:CatalogItem' + end + + def references { - "@id" => "/catalog_items/#{@variant.id}", - "@type" => "dfc:CatalogItem", - "dfc:references" => { - "@type" => "@id", - "@id" => "/supplied_products/#{@variant.product_id}" - }, - "dfc:sku" => @variant.sku, - "dfc:stockLimitation" => nil, - "dfc:offeredThrough" => serialized_offers + '@type' => '@id', + '@id' => "/supplied_products/#{object.product_id}" } end - private + def sku + object.sku + end - def serialized_offers - [ - OfferSerializer.new(@variant).serialized_data - ] + def stock_limitation; end + + def offered_through + [object] end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb index 2afebb6ecf..f381e9e858 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb @@ -3,43 +3,47 @@ # Serializer used to render a DFC Enterprise from an OFN Enterprise # into JSON-LD format based on DFC ontology module DfcProvider - class EnterpriseSerializer - def initialize(enterprise) - @enterprise = enterprise + class EnterpriseSerializer < ActiveModel::Serializer + attribute :id, key: '@id' + attribute :type, key: '@type' + attribute :vat_number, key: 'dfc:VATnumber' + has_many :defines, key: 'dfc:defines' + has_many :supplies, + key: 'dfc:supplies', + serializer: DfcProvider::SuppliedProductSerializer + has_many :manages, + key: 'dfc:manages', + serializer: DfcProvider::CatalogItemSerializer + + def id + "/entreprises/#{object.id}" end - def serialized_data - { - "@id" => "/entreprises/#{@enterprise.id}", - "@type" => "dfc:Entreprise", - "dfc:VATnumber" => nil, - "dfc:defines" => [], - "dfc:supplies" => serialized_supplied_products, - "dfc:manages" => serialized_catalog_items - } + def type + 'dfc:Entreprise' + end + + def vat_number; end + + def defines + [] + end + + def supplies + products + end + + def manages + products.map(&:variants).flatten end private def products @products ||= - @enterprise. + object. supplied_products. includes(variants: :product) end - - def serialized_supplied_products - products.map do |product| - SuppliedProductSerializer.new(product).serialized_data - end - end - - def serialized_catalog_items - @products.map do |product| - product.variants.map do |variant| - CatalogItemSerializer.new(variant).serialized_data - end - end.flatten - end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb index 1ecd072fb6..c0033b2f9f 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb @@ -3,22 +3,34 @@ # Serializer used to render the DFC Offer from an OFN Product # into JSON-LD format based on DFC ontology module DfcProvider - class OfferSerializer - def initialize(variant) - @variant = variant + class OfferSerializer < ActiveModel::Serializer + attribute :id, key: '@id' + attribute :type, key: '@type' + attribute :offeres_to, key: 'dfc:offeres_to' + attribute :price, key: 'dfc:price' + attribute :stock_limitation, key: 'dfc:stockLimitation' + + def id + "/offers/#{object.id}" end - def serialized_data + def type + 'dfc:Offer' + end + + def offeres_to { - "@id" => "offers/#{@variant.id}", - "@type" => "dfc:Offer", - "dfc:offeresTo" => { - "@type" => "@id", - "@id" => "/customerCategoryId1" - }, - "dfc:price" => @variant.price, - "dfc:stockLimitation" => @variant.on_hand, + '@type' => '@id', + '@id' => nil } end + + def price + object.price + end + + def stock_limitation + object.on_hand + end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb index 04c1a28f9f..954a58f13f 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb @@ -3,34 +3,34 @@ # Serializer used to render the DFC Person from an OFN User # into JSON-LD format based on DFC ontology module DfcProvider - class PersonSerializer - def initialize(user) - @user = user + class PersonSerializer < ActiveModel::Serializer + attribute :id, key: '@id' + attribute :type, key: '@type' + attribute :family_name, key: 'dfc:familyName' + attribute :first_name, key: 'dfc:firstName' + has_one :address, + key: 'dfc:hasAddress', + serializer: DfcProvider::AddressSerializer + has_many :affiliates, + key: 'dfc:affiliates', + serializer: DfcProvider::EnterpriseSerializer + + def id + "/personId/#{object.id}" end - def serialized_data - { - "@id" => "/personId/#{@user.id}", - "@type" => "dfc:Person", - "dfc:familyName" => @user.login, - "dfc:firtsName" => @user.email, - "dfc:hasAdress" => { - "@type" => "dfc:Address", - "dfc:city" => nil, - "dfc:country" => nil, - "dfc:postcode" => nil, - "dfc:street" => nil - }, - "dfc:affiliates" => affiliates_serialized_data - } + def type + 'dfc:Person' end - private + def family_name; end - def affiliates_serialized_data - @user.enterprises.map do |enterprise| - EnterpriseSerializer.new(enterprise).serialized_data - end + def first_name; end + + def address; end + + def affiliates + object.enterprises end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb index 7b05fbd827..2e9f6bb433 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb @@ -3,33 +3,59 @@ # Serializer used to render a DFC SuppliedProduct from an OFN Product # into JSON-LD format based on DFC ontology module DfcProvider - class SuppliedProductSerializer - def initialize(product) - @product = product + class SuppliedProductSerializer < ActiveModel::Serializer + attribute :id, key: '@id' + attribute :type, key: '@type' + attribute :unit, key: 'dfc:hasUnit' + attribute :quantity, key: 'dfc:quantity' + attribute :description, key: 'dfc:description' + attribute :total_theoritical_stock, key: 'dfc:totalTheoriticalStock' + attribute :brand, key: 'dfc:brand' + attribute :claim, key: 'dfc:claim' + attribute :image, key: 'dfc:image' + attribute :life_time, key: 'lifeTime' + has_many :physical_characteristics, key: 'dfc:physicalCharacterisctics' + + def id + "/supplied_products/#{object.id}" end - def serialized_data + def type + 'dfc:SuppliedProduct' + end + + def unit { - "@id" => "/products/#{@product.id}", - "dfc:hasUnit" => { - "@id" => "/unit/#{unit_name}", - "rdfs:label" => unit_name - }, - "dfc:quantity" => @product.on_hand, - "dfc:description" => @product.name, - "dfc:totalTheoriticalStock" => nil, - "dfc:brand" => nil, - "dfc:claim" => nil, - "dfc:image" => @product.images.first.try(:attachment, :url), - "lifeTime" => nil, - "dfc:physicalCharacterisctics" => nil + '@id' => "/unit/#{unit_name}", + 'rdfs:label' => unit_name } end + def quantity + object.on_hand + end + + def description + object.name + end + + def total_theoritical_stock; end + def brand; end + def claim; end + + def image + object.images.first.try(:attachment, :url) + end + + def life_time; end + def physical_characteristics + [] + end + private def unit_name - @product.unit_description.presence || 'piece' + object.unit_description.presence || 'piece' end end end diff --git a/engines/dfc_provider/dfc_provider.gemspec b/engines/dfc_provider/dfc_provider.gemspec index 4684aaaa18..94bc373194 100644 --- a/engines/dfc_provider/dfc_provider.gemspec +++ b/engines/dfc_provider/dfc_provider.gemspec @@ -18,4 +18,5 @@ Gem::Specification.new do |spec| spec.add_dependency 'jwt', '~> 2.2' spec.add_dependency 'rspec', '~> 3.9' + spec.add_dependency 'active_model_serializers', '~> 0.8.4' end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb index e2dee42dd1..1cc911cd09 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb @@ -35,7 +35,7 @@ describe DfcProvider::Api::ProductsController, type: :controller do expect(response.body) .to include(product.name) expect(response.body) - .to include(user.email) + .to include(product.sku) expect(response.body) .to include("offers/#{product.variants.first.id}") end @@ -62,7 +62,7 @@ describe DfcProvider::Api::ProductsController, type: :controller do expect(response.body) .to include(product.name) expect(response.body) - .to include(user.email) + .to include(product.sku) expect(response.body) .to include("offers/#{product.variants.first.id}") end From d10fda6227a8426ba07206ff6d833667132e46c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 12 Aug 2020 13:37:48 +0200 Subject: [PATCH 07/23] Put context inside serializer --- .../dfc_provider/api/products_controller.rb | 12 +----------- .../serializers/dfc_provider/person_serializer.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb index 25c01db68d..eb7a778e50 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb @@ -14,10 +14,7 @@ module DfcProvider respond_to :json def index - render json: @user, - serializer: DfcProvider::PersonSerializer, - meta: meta_data, - meta_key: '@context' + render json: @user, serializer: DfcProvider::PersonSerializer end private @@ -56,13 +53,6 @@ module DfcProvider def authorization_control DfcProvider::AuthorizationControl.new(access_token) end - - def meta_data - { - "dfc" => "http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#", - "@base" => "#{root_url}api/dfc_provider" - } - end end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb index 954a58f13f..ed59b41298 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb @@ -4,6 +4,7 @@ # into JSON-LD format based on DFC ontology module DfcProvider class PersonSerializer < ActiveModel::Serializer + attribute :context, key: '@context' attribute :id, key: '@id' attribute :type, key: '@type' attribute :family_name, key: 'dfc:familyName' @@ -15,6 +16,15 @@ module DfcProvider key: 'dfc:affiliates', serializer: DfcProvider::EnterpriseSerializer + # Context should be provided inside the controller, + # but AMS doesn't not supported `meta` and `meta_key` with `root` to nil... + def context + { + 'dfc' => 'http://datafoodconsortium.org/ontologies/DFC_FullModel.owl#', + '@base' => "#{root_url}api/dfc_provider" + } + end + def id "/personId/#{object.id}" end From 508ecd6bf72bc5e70e61f335e2ffcd815b99682c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 12 Aug 2020 13:46:23 +0200 Subject: [PATCH 08/23] Adjust with Rubocop suggestions --- .../app/serializers/dfc_provider/address_serializer.rb | 3 +++ .../app/serializers/dfc_provider/catalog_item_serializer.rb | 6 ++---- .../app/serializers/dfc_provider/offer_serializer.rb | 6 ++---- .../serializers/dfc_provider/supplied_product_serializer.rb | 3 +++ engines/dfc_provider/dfc_provider.gemspec | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb index efa717298e..3d99938d6e 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/address_serializer.rb @@ -15,8 +15,11 @@ module DfcProvider end def city; end + def country; end + def postcode; end + def street; end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index 41dcf57572..aded6e8258 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -13,6 +13,8 @@ module DfcProvider serializer: DfcProvider::OfferSerializer, key: 'dfc:offeredThrough' + delegate :sku, to: :object + def id "/catalog_items/#{object.id}" end @@ -28,10 +30,6 @@ module DfcProvider } end - def sku - object.sku - end - def stock_limitation; end def offered_through diff --git a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb index c0033b2f9f..50896125bf 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb @@ -10,6 +10,8 @@ module DfcProvider attribute :price, key: 'dfc:price' attribute :stock_limitation, key: 'dfc:stockLimitation' + delegate :price, to: :object + def id "/offers/#{object.id}" end @@ -25,10 +27,6 @@ module DfcProvider } end - def price - object.price - end - def stock_limitation object.on_hand end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb index 2e9f6bb433..2be61f6284 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb @@ -40,7 +40,9 @@ module DfcProvider end def total_theoritical_stock; end + def brand; end + def claim; end def image @@ -48,6 +50,7 @@ module DfcProvider end def life_time; end + def physical_characteristics [] end diff --git a/engines/dfc_provider/dfc_provider.gemspec b/engines/dfc_provider/dfc_provider.gemspec index 94bc373194..e5f306fc53 100644 --- a/engines/dfc_provider/dfc_provider.gemspec +++ b/engines/dfc_provider/dfc_provider.gemspec @@ -16,7 +16,7 @@ Gem::Specification.new do |spec| spec.files = Dir["{app,config,lib}/**/*"] + ['README.md'] spec.test_files = Dir['spec/**/*'] + spec.add_dependency 'active_model_serializers', '~> 0.8.4' spec.add_dependency 'jwt', '~> 2.2' spec.add_dependency 'rspec', '~> 3.9' - spec.add_dependency 'active_model_serializers', '~> 0.8.4' end From 13e15f823e94db1c0b120fdff574ee9f6f16b65c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 12 Aug 2020 18:30:08 +0200 Subject: [PATCH 09/23] Add Read action for Enterprise and CatalogItem --- .../dfc_provider/api/base_controller.rb | 57 +++++++++++++++++++ .../api/enterprises_controller.rb | 27 +++++++++ .../dfc_provider/api/products_controller.rb | 47 ++------------- .../dfc_provider/catalog_item_serializer.rb | 12 +++- .../dfc_provider/enterprise_serializer.rb | 20 ++++--- engines/dfc_provider/config/routes.rb | 4 +- .../dfc_provider/api/enterprises_spec.rb | 48 ++++++++++++++++ .../api/products_controller_spec.rb | 51 +++++++++++++++++ 8 files changed, 214 insertions(+), 52 deletions(-) create mode 100644 engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb create mode 100644 engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb create mode 100644 engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb new file mode 100644 index 0000000000..37e46a2993 --- /dev/null +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +# Controller used to provide the API products for the DFC application +module DfcProvider + module Api + class BaseController < ::ActionController::Base + rescue_from ActiveRecord::RecordNotFound, with: :not_found + + before_filter :check_authorization, + :check_user, + :check_enterprise + + respond_to :json + + private + + def check_authorization + return if access_token.present? + + head :unprocessable_entity + end + + def check_user + @user = authorization_control.process + + return if @user.present? + + head :unauthorized + end + + def check_enterprise + @enterprise = + if params[:enterprise_id] == 'default' + @user.enterprises.first + else + @user.enterprises.where(id: params[:enterprise_id]).first + end + + return if @enterprise.present? + + head :not_found + end + + def access_token + request.headers['Authorization'].to_s.split(' ').last + end + + def authorization_control + DfcProvider::AuthorizationControl.new(access_token) + end + + def not_found + head :not_found + end + end + end +end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb new file mode 100644 index 0000000000..63cf10f406 --- /dev/null +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +# Controller used to provide the API products for the DFC application +module DfcProvider + module Api + class EnterprisesController < BaseController + def show + render json: @enterprise, serializer: DfcProvider::EnterpriseSerializer + end + + private + + def check_enterprise + @enterprise = + if params[:id] == 'default' + @user.enterprises.first + else + @user.enterprises.where(id: params[:id]).first + end + + return if @enterprise.present? + + head :not_found + end + end + end +end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb index eb7a778e50..0e96881a90 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb @@ -3,55 +3,20 @@ # Controller used to provide the API products for the DFC application module DfcProvider module Api - class ProductsController < ::ActionController::Base + class ProductsController < BaseController # To access 'base_url' helper include Rails.application.routes.url_helpers - before_filter :check_authorization, - :check_user, - :check_enterprise - - respond_to :json - def index render json: @user, serializer: DfcProvider::PersonSerializer end - private + def show + @variant = Spree::Variant.joins(product: :supplier) + .where('enterprises.id' => @enterprise.id) + .find(params[:id]) - def check_enterprise - @enterprise = - if params[:enterprise_id] == 'default' - @user.enterprises.first - else - @user.enterprises.where(id: params[:enterprise_id]).first - end - - return if @enterprise.present? - - head :not_found - end - - def check_authorization - return if access_token.present? - - head :unprocessable_entity - end - - def check_user - @user = authorization_control.process - - return if @user.present? - - head :unauthorized - end - - def access_token - request.headers['Authorization'].to_s.split(' ').last - end - - def authorization_control - DfcProvider::AuthorizationControl.new(access_token) + render json: @variant, serializer: DfcProvider::CatalogItemSerializer end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index aded6e8258..e0d8612b07 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -16,7 +16,11 @@ module DfcProvider delegate :sku, to: :object def id - "/catalog_items/#{object.id}" + dfc_provider_routes.api_dfc_provider_enterprise_product_url( + enterprise_id: object.product.supplier_id, + id: object.id, + host: root_url + ) end def type @@ -35,5 +39,11 @@ module DfcProvider def offered_through [object] end + + private + + def dfc_provider_routes + DfcProvider::Engine.routes.url_helpers + end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb index f381e9e858..9d1dd73eb4 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb @@ -16,7 +16,10 @@ module DfcProvider serializer: DfcProvider::CatalogItemSerializer def id - "/entreprises/#{object.id}" + dfc_provider_routes.api_dfc_provider_enterprise_url( + id: object.id, + host: root_url + ) end def type @@ -30,20 +33,21 @@ module DfcProvider end def supplies - products + object. + supplied_products. + includes(variants: :product) end def manages - products.map(&:variants).flatten + Spree::Variant. + joins(product: :supplier). + where('enterprises.id' => object.id) end private - def products - @products ||= - object. - supplied_products. - includes(variants: :product) + def dfc_provider_routes + DfcProvider::Engine.routes.url_helpers end end end diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index b88e13e768..e4d8385a4f 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -3,8 +3,8 @@ DfcProvider::Engine.routes.draw do namespace :api do scope :dfc_provider, as: :dfc_provider, path: '/dfc_provider' do - resources :enterprises, only: :none do - resources :products, only: [:index] + resources :enterprises, only: [:show] do + resources :products, only: [:index, :show] end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb new file mode 100644 index 0000000000..989bd2bb8b --- /dev/null +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe DfcProvider::Api::EnterprisesController, type: :controller do + render_views + + let!(:user) { create(:user) } + let!(:enterprise) { create(:distributor_enterprise, owner: user) } + let!(:product) { create(:simple_product, supplier: enterprise ) } + + describe('.show') do + context 'with authorization token' do + before do + request.headers['Authorization'] = 'Bearer 123456.abcdef.123456' + end + + context 'with an authenticated user' do + before do + allow_any_instance_of(DfcProvider::AuthorizationControl) + .to receive(:process) + .and_return(user) + end + + context 'with an enterprise' do + context 'given with an id' do + context 'related to the user' do + before { api_get :show, id: 'default' } + + it 'is successful' do + expect(response.status).to eq 200 + end + + it 'renders the required content' do + expect(response.body) + .to include(product.name) + expect(response.body) + .to include(product.sku) + expect(response.body) + .to include("offers/#{product.variants.first.id}") + end + end + end + end + end + end + end +end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb index 1cc911cd09..042d2cbbe9 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb @@ -98,4 +98,55 @@ describe DfcProvider::Api::ProductsController, type: :controller do end end end + + describe('.show') do + context 'with authorization token' do + before do + request.headers['Authorization'] = 'Bearer 123456.abcdef.123456' + end + + context 'with an authenticated user' do + before do + allow_any_instance_of(DfcProvider::AuthorizationControl) + .to receive(:process) + .and_return(user) + end + + context 'with an enterprise' do + context 'given with an id' do + context 'related to the user' do + before do + api_get :show, + enterprise_id: enterprise.id, + id: product.variants.first.id + end + + it 'is successful' do + expect(response.status).to eq 200 + end + + it 'renders the required content' do + expect(response.body) + .to include('dfc:CatalogItem') + expect(response.body) + .to include("offers/#{product.variants.first.id}") + end + end + + context 'with a variant not linked to the enterprise' do + before do + api_get :show, + enterprise_id: enterprise.id, + id: create(:simple_product).variants.first.id + end + + it 'returns a 404 error' do + expect(response.status).to eq 404 + end + end + end + end + end + end + end end From a4e8982351e06986d5ab58d1eab601225b61d2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 12 Aug 2020 19:46:38 +0200 Subject: [PATCH 10/23] Rename ProductsController into CatalogItemsController --- ...ts_controller.rb => catalog_items_controller.rb} | 13 ++++++------- .../dfc_provider/catalog_item_serializer.rb | 2 +- engines/dfc_provider/config/routes.rb | 2 +- ...ler_spec.rb => catalog_items_controller_spec.rb} | 2 +- .../dfc_provider/api/enterprises_spec.rb | 8 ++++++++ 5 files changed, 17 insertions(+), 10 deletions(-) rename engines/dfc_provider/app/controllers/dfc_provider/api/{products_controller.rb => catalog_items_controller.rb} (52%) rename engines/dfc_provider/spec/controllers/dfc_provider/api/{products_controller_spec.rb => catalog_items_controller_spec.rb} (98%) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb similarity index 52% rename from engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb rename to engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb index 0e96881a90..a581d26813 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb @@ -3,18 +3,17 @@ # Controller used to provide the API products for the DFC application module DfcProvider module Api - class ProductsController < BaseController - # To access 'base_url' helper - include Rails.application.routes.url_helpers - + class CatalogItemsController < BaseController def index render json: @user, serializer: DfcProvider::PersonSerializer end def show - @variant = Spree::Variant.joins(product: :supplier) - .where('enterprises.id' => @enterprise.id) - .find(params[:id]) + @variant = + Spree::Variant. + joins(product: :supplier). + where('enterprises.id' => @enterprise.id). + find(params[:id]) render json: @variant, serializer: DfcProvider::CatalogItemSerializer end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index e0d8612b07..412f39bd70 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -16,7 +16,7 @@ module DfcProvider delegate :sku, to: :object def id - dfc_provider_routes.api_dfc_provider_enterprise_product_url( + dfc_provider_routes.api_dfc_provider_enterprise_catalog_item_url( enterprise_id: object.product.supplier_id, id: object.id, host: root_url diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index e4d8385a4f..eecfa7ee42 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -4,7 +4,7 @@ DfcProvider::Engine.routes.draw do namespace :api do scope :dfc_provider, as: :dfc_provider, path: '/dfc_provider' do resources :enterprises, only: [:show] do - resources :products, only: [:index, :show] + resources :catalog_item, only: [:index, :show] end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb similarity index 98% rename from engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb rename to engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb index 042d2cbbe9..51b0692bd3 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/products_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe DfcProvider::Api::ProductsController, type: :controller do +describe DfcProvider::Api::CatalogItemsController, type: :controller do render_views let!(:user) { create(:user) } diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb index 989bd2bb8b..883d6c61b7 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb @@ -41,6 +41,14 @@ describe DfcProvider::Api::EnterprisesController, type: :controller do end end end + + context 'given with a wrong id' do + before { api_get :show, id: 999 } + + it 'returns 404' do + expect(response.status).to eq 404 + end + end end end end From 46d38930d96573c931e6d424121b33f0ef319739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 12 Aug 2020 20:48:41 +0200 Subject: [PATCH 11/23] Add some ajustements --- .../api/enterprises_controller.rb | 2 +- engines/dfc_provider/config/routes.rb | 2 +- .../api/catalog_items_controller_spec.rb | 50 +++++++++---------- .../dfc_provider/api/enterprises_spec.rb | 24 ++++----- 4 files changed, 37 insertions(+), 41 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb index 63cf10f406..41639526d4 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Controller used to provide the API products for the DFC application +# Controller used to provide the CatalogItem API for the DFC application module DfcProvider module Api class EnterprisesController < BaseController diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index eecfa7ee42..38d7baff2e 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -4,7 +4,7 @@ DfcProvider::Engine.routes.draw do namespace :api do scope :dfc_provider, as: :dfc_provider, path: '/dfc_provider' do resources :enterprises, only: [:show] do - resources :catalog_item, only: [:index, :show] + resources :catalog_items, only: [:index, :show] end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb index 51b0692bd3..797166cf0b 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb @@ -114,35 +114,33 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do context 'with an enterprise' do context 'given with an id' do - context 'related to the user' do - before do - api_get :show, - enterprise_id: enterprise.id, - id: product.variants.first.id - end - - it 'is successful' do - expect(response.status).to eq 200 - end - - it 'renders the required content' do - expect(response.body) - .to include('dfc:CatalogItem') - expect(response.body) - .to include("offers/#{product.variants.first.id}") - end + before do + api_get :show, + enterprise_id: enterprise.id, + id: product.variants.first.id end - context 'with a variant not linked to the enterprise' do - before do - api_get :show, - enterprise_id: enterprise.id, - id: create(:simple_product).variants.first.id - end + it 'is successful' do + expect(response.status).to eq 200 + end - it 'returns a 404 error' do - expect(response.status).to eq 404 - end + it 'renders the required content' do + expect(response.body) + .to include('dfc:CatalogItem') + expect(response.body) + .to include("offers/#{product.variants.first.id}") + end + end + + context 'with a variant not linked to the enterprise' do + before do + api_get :show, + enterprise_id: enterprise.id, + id: create(:simple_product).variants.first.id + end + + it 'returns a 404 error' do + expect(response.status).to eq 404 end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb index 883d6c61b7..691fcb4e0e 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb @@ -24,21 +24,19 @@ describe DfcProvider::Api::EnterprisesController, type: :controller do context 'with an enterprise' do context 'given with an id' do - context 'related to the user' do - before { api_get :show, id: 'default' } + before { api_get :show, id: 'default' } - it 'is successful' do - expect(response.status).to eq 200 - end + it 'is successful' do + expect(response.status).to eq 200 + end - it 'renders the required content' do - expect(response.body) - .to include(product.name) - expect(response.body) - .to include(product.sku) - expect(response.body) - .to include("offers/#{product.variants.first.id}") - end + it 'renders the required content' do + expect(response.body) + .to include(product.name) + expect(response.body) + .to include(product.sku) + expect(response.body) + .to include("offers/#{product.variants.first.id}") end end From 99e905c768532980943946dcaba83467874fc2c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 13 Aug 2020 11:02:31 +0200 Subject: [PATCH 12/23] Simplify enterprise check logic --- .../app/controllers/dfc_provider/api/base_controller.rb | 8 ++------ .../dfc_provider/api/enterprises_controller.rb | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb index 37e46a2993..0e206aa71c 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb @@ -31,14 +31,10 @@ module DfcProvider def check_enterprise @enterprise = if params[:enterprise_id] == 'default' - @user.enterprises.first + @user.enterprises.first! else - @user.enterprises.where(id: params[:enterprise_id]).first + @user.enterprises.find(params[:enterprise_id]) end - - return if @enterprise.present? - - head :not_found end def access_token diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb index 41639526d4..a7ce0917f1 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb @@ -13,14 +13,10 @@ module DfcProvider def check_enterprise @enterprise = if params[:id] == 'default' - @user.enterprises.first + @user.enterprises.first! else - @user.enterprises.where(id: params[:id]).first + @user.enterprises.find(params[:id]) end - - return if @enterprise.present? - - head :not_found end end end From 8d4587506b9d216330ffcce6416082cead539b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 13 Aug 2020 11:02:54 +0200 Subject: [PATCH 13/23] Add SuppliedProducts controller --- .../api/supplied_products_controller.rb | 14 +++++ .../dfc_provider/catalog_item_serializer.rb | 8 +++ .../supplied_product_serializer.rb | 10 +++- engines/dfc_provider/config/routes.rb | 1 + .../api/supplied_products_controller_spec.rb | 54 +++++++++++++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb create mode 100644 engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb new file mode 100644 index 0000000000..a078bbe66e --- /dev/null +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +# Controller used to provide the SuppliedProducts API for the DFC application +module DfcProvider + module Api + class SuppliedProductsController < BaseController + def show + @product = @enterprise.supplied_products.find(params[:id]) + + render json: @product, serializer: DfcProvider::SuppliedProductSerializer + end + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index 412f39bd70..0b98993305 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -42,6 +42,14 @@ module DfcProvider private + def reference_id + dfc_provider_routes.api_dfc_provider_enterprise_supplied_product_url( + enterprise_id: object.product.supplier_id, + id: object.product_id, + host: root_url + ) + end + def dfc_provider_routes DfcProvider::Engine.routes.url_helpers end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb index 2be61f6284..8c791dca75 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb @@ -17,7 +17,11 @@ module DfcProvider has_many :physical_characteristics, key: 'dfc:physicalCharacterisctics' def id - "/supplied_products/#{object.id}" + dfc_provider_routes.api_dfc_provider_enterprise_supplied_product_url( + enterprise_id: object.supplier_id, + id: object.id, + host: root_url + ) end def type @@ -60,5 +64,9 @@ module DfcProvider def unit_name object.unit_description.presence || 'piece' end + + def dfc_provider_routes + DfcProvider::Engine.routes.url_helpers + end end end diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index 38d7baff2e..fe7f004c90 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -5,6 +5,7 @@ DfcProvider::Engine.routes.draw do scope :dfc_provider, as: :dfc_provider, path: '/dfc_provider' do resources :enterprises, only: [:show] do resources :catalog_items, only: [:index, :show] + resources :supplied_products, only: [:show] end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb new file mode 100644 index 0000000000..a4a2c0731e --- /dev/null +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe DfcProvider::Api::SuppliedProductsController, type: :controller do + render_views + + let!(:user) { create(:user) } + let!(:enterprise) { create(:distributor_enterprise, owner: user) } + let!(:product) { create(:simple_product, supplier: enterprise ) } + + describe('.show') do + context 'with authorization token' do + before do + request.headers['Authorization'] = 'Bearer 123456.abcdef.123456' + end + + context 'with an authenticated user' do + before do + allow_any_instance_of(DfcProvider::AuthorizationControl) + .to receive(:process) + .and_return(user) + end + + context 'with an enterprise' do + context 'given with an id' do + before do + api_get :show, + enterprise_id: 'default', + id: product.id + end + + it 'is successful' do + expect(response.status).to eq 200 + end + + it 'renders the required content' do + expect(response.body) + .to include(product.name) + end + end + + context 'given with a wrong id' do + before { api_get :show, id: 999 } + + it 'returns 404' do + expect(response.status).to eq 404 + end + end + end + end + end + end +end From c3cf08156d0736d8326dfd871b8bd32911d6c449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 13 Aug 2020 11:47:56 +0200 Subject: [PATCH 14/23] Add People controller --- .../dfc_provider/api/people_controller.rb | 28 +++++++++++ .../dfc_provider/person_serializer.rb | 11 ++++- engines/dfc_provider/config/routes.rb | 1 + .../api/people_controller_spec.rb | 48 +++++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb create mode 100644 engines/dfc_provider/spec/controllers/dfc_provider/api/people_controller_spec.rb diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb new file mode 100644 index 0000000000..02852ec084 --- /dev/null +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +# Controller used to provide the People API for the DFC application +module DfcProvider + module Api + class PeopleController < BaseController + skip_before_filter :check_enterprise + + before_filter :find_user, :check_user_accessibility + + def show + render json: @user, serializer: DfcProvider::PersonSerializer + end + + private + + def find_user + @retrieved_user = Spree::User.find(params[:id]) + end + + def check_user_accessibility + return if @user == @retrieved_user + + not_found + end + end + end +end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb index ed59b41298..8ee3df99c0 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/person_serializer.rb @@ -26,7 +26,10 @@ module DfcProvider end def id - "/personId/#{object.id}" + dfc_provider_routes.api_dfc_provider_person_url( + id: object.id, + host: root_url + ) end def type @@ -42,5 +45,11 @@ module DfcProvider def affiliates object.enterprises end + + private + + def dfc_provider_routes + DfcProvider::Engine.routes.url_helpers + end end end diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index fe7f004c90..1bca54f06b 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -7,6 +7,7 @@ DfcProvider::Engine.routes.draw do resources :catalog_items, only: [:index, :show] resources :supplied_products, only: [:show] end + resources :people, only: [:show] end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/people_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/people_controller_spec.rb new file mode 100644 index 0000000000..95a5610aec --- /dev/null +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/people_controller_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe DfcProvider::Api::PeopleController, type: :controller do + render_views + + let!(:user) { create(:user) } + + describe('.show') do + context 'with authorization token' do + before do + request.headers['Authorization'] = 'Bearer 123456.abcdef.123456' + end + + context 'with an authenticated user' do + before do + allow_any_instance_of(DfcProvider::AuthorizationControl) + .to receive(:process) + .and_return(user) + end + + context 'given with an accessible id' do + before do + api_get :show, + id: user.id + end + + it 'is successful' do + expect(response.status).to eq 200 + end + + it 'renders the required content' do + expect(response.body).to include('dfc:Person') + end + end + + context 'with an other user id' do + before { api_get :show, id: create(:user).id } + + it 'returns 404' do + expect(response.status).to eq 404 + end + end + end + end + end +end From d5800642e70b82d3f53a310ba6f4be7a78687901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Sun, 30 Aug 2020 17:38:53 +0200 Subject: [PATCH 15/23] Map DFC SuppliedProduct with OFN Variant --- .../api/catalog_items_controller.rb | 10 +++++++--- .../api/supplied_products_controller.rb | 12 ++++++++++-- .../dfc_provider/enterprise_serializer.rb | 6 +++--- .../dfc_provider/supplied_product_serializer.rb | 4 ++-- .../api/catalog_items_controller_spec.rb | 17 +++++++++-------- .../api/supplied_products_controller_spec.rb | 5 +++-- 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb index a581d26813..99cdd9f8ee 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb @@ -9,13 +9,17 @@ module DfcProvider end def show - @variant = + render json: variant, serializer: DfcProvider::CatalogItemSerializer + end + + private + + def variant + @variant ||= Spree::Variant. joins(product: :supplier). where('enterprises.id' => @enterprise.id). find(params[:id]) - - render json: @variant, serializer: DfcProvider::CatalogItemSerializer end end end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb index a078bbe66e..2c4e5c677e 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb @@ -5,9 +5,17 @@ module DfcProvider module Api class SuppliedProductsController < BaseController def show - @product = @enterprise.supplied_products.find(params[:id]) + render json: variant, serializer: DfcProvider::SuppliedProductSerializer + end - render json: @product, serializer: DfcProvider::SuppliedProductSerializer + private + + def variant + @variant ||= + Spree::Variant. + joins(product: :supplier). + where('enterprises.id' => @enterprise.id). + find(params[:id]) end end end diff --git a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb index 9d1dd73eb4..ada1069a20 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/enterprise_serializer.rb @@ -33,9 +33,9 @@ module DfcProvider end def supplies - object. - supplied_products. - includes(variants: :product) + Spree::Variant. + joins(product: :supplier). + where('enterprises.id' => object.id) end def manages diff --git a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb index 8c791dca75..1ebf34e843 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/supplied_product_serializer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -# Serializer used to render a DFC SuppliedProduct from an OFN Product +# Serializer used to render a DFC SuppliedProduct from an OFN Variant # into JSON-LD format based on DFC ontology module DfcProvider class SuppliedProductSerializer < ActiveModel::Serializer @@ -18,7 +18,7 @@ module DfcProvider def id dfc_provider_routes.api_dfc_provider_enterprise_supplied_product_url( - enterprise_id: object.supplier_id, + enterprise_id: object.product.supplier_id, id: object.id, host: root_url ) diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb index 797166cf0b..7b5d42865a 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb @@ -8,6 +8,7 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do let!(:user) { create(:user) } let!(:enterprise) { create(:distributor_enterprise, owner: user) } let!(:product) { create(:simple_product, supplier: enterprise ) } + let!(:variant) { product.variants.first } describe('.index') do context 'with authorization token' do @@ -33,11 +34,11 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do it 'renders the required content' do expect(response.body) - .to include(product.name) + .to include(variant.name) expect(response.body) - .to include(product.sku) + .to include(variant.sku) expect(response.body) - .to include("offers/#{product.variants.first.id}") + .to include("offers/#{variant.id}") end end @@ -60,11 +61,11 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do it 'renders the required content' do expect(response.body) - .to include(product.name) + .to include(variant.name) expect(response.body) - .to include(product.sku) + .to include(variant.sku) expect(response.body) - .to include("offers/#{product.variants.first.id}") + .to include("offers/#{variant.id}") end end end @@ -117,7 +118,7 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do before do api_get :show, enterprise_id: enterprise.id, - id: product.variants.first.id + id: variant.id end it 'is successful' do @@ -128,7 +129,7 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do expect(response.body) .to include('dfc:CatalogItem') expect(response.body) - .to include("offers/#{product.variants.first.id}") + .to include("offers/#{variant.id}") end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb index a4a2c0731e..de594d276d 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb @@ -8,6 +8,7 @@ describe DfcProvider::Api::SuppliedProductsController, type: :controller do let!(:user) { create(:user) } let!(:enterprise) { create(:distributor_enterprise, owner: user) } let!(:product) { create(:simple_product, supplier: enterprise ) } + let!(:variant) { product.variants.first } describe('.show') do context 'with authorization token' do @@ -27,7 +28,7 @@ describe DfcProvider::Api::SuppliedProductsController, type: :controller do before do api_get :show, enterprise_id: 'default', - id: product.id + id: variant.id end it 'is successful' do @@ -36,7 +37,7 @@ describe DfcProvider::Api::SuppliedProductsController, type: :controller do it 'renders the required content' do expect(response.body) - .to include(product.name) + .to include(variant.name) end end From 4f2b7094d0cf64f2ec33cbb0faacf239021ca0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 2 Sep 2020 21:48:13 +0200 Subject: [PATCH 16/23] Use before_action instead of before_filter --- .../app/controllers/dfc_provider/api/base_controller.rb | 2 +- .../app/controllers/dfc_provider/api/people_controller.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb index 0e206aa71c..0fe7de959b 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb @@ -6,7 +6,7 @@ module DfcProvider class BaseController < ::ActionController::Base rescue_from ActiveRecord::RecordNotFound, with: :not_found - before_filter :check_authorization, + before_action :check_authorization, :check_user, :check_enterprise diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb index 02852ec084..2da4b7c4fe 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb @@ -4,9 +4,9 @@ module DfcProvider module Api class PeopleController < BaseController - skip_before_filter :check_enterprise + skip_before_action :check_enterprise - before_filter :find_user, :check_user_accessibility + before_action :find_user, :check_user_accessibility def show render json: @user, serializer: DfcProvider::PersonSerializer From 1baba5b61c4a75e5910ee8726a4d28f4dc55bfae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 2 Sep 2020 22:18:56 +0200 Subject: [PATCH 17/23] Introduce current_user with memoization --- .../controllers/dfc_provider/api/base_controller.rb | 12 +++++++----- .../dfc_provider/api/catalog_items_controller.rb | 2 +- .../dfc_provider/api/enterprises_controller.rb | 4 ++-- .../dfc_provider/api/people_controller.rb | 10 +++++----- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb index 0fe7de959b..a896428ba4 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb @@ -21,9 +21,7 @@ module DfcProvider end def check_user - @user = authorization_control.process - - return if @user.present? + return if current_user.present? head :unauthorized end @@ -31,12 +29,16 @@ module DfcProvider def check_enterprise @enterprise = if params[:enterprise_id] == 'default' - @user.enterprises.first! + current_user.enterprises.first! else - @user.enterprises.find(params[:enterprise_id]) + current_user.enterprises.find(params[:enterprise_id]) end end + def current_user + @current_user ||= authorization_control.process + end + def access_token request.headers['Authorization'].to_s.split(' ').last end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb index 99cdd9f8ee..6f5111159f 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb @@ -5,7 +5,7 @@ module DfcProvider module Api class CatalogItemsController < BaseController def index - render json: @user, serializer: DfcProvider::PersonSerializer + render json: current_user, serializer: DfcProvider::PersonSerializer end def show diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb index a7ce0917f1..9a076c98af 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb @@ -13,9 +13,9 @@ module DfcProvider def check_enterprise @enterprise = if params[:id] == 'default' - @user.enterprises.first! + current_user.enterprises.first! else - @user.enterprises.find(params[:id]) + current_user.enterprises.find(params[:id]) end end end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb index 2da4b7c4fe..e0d1a7432c 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb @@ -6,20 +6,20 @@ module DfcProvider class PeopleController < BaseController skip_before_action :check_enterprise - before_action :find_user, :check_user_accessibility + before_action :check_user_accessibility def show - render json: @user, serializer: DfcProvider::PersonSerializer + render json: user, serializer: DfcProvider::PersonSerializer end private - def find_user - @retrieved_user = Spree::User.find(params[:id]) + def user + @user ||= Spree::User.find(params[:id]) end def check_user_accessibility - return if @user == @retrieved_user + return if current_user == user not_found end From 6508897e3d28ec52a9553a38c8192be924225871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 2 Sep 2020 22:26:38 +0200 Subject: [PATCH 18/23] Introduce current_enterprise with memoization --- .../app/controllers/dfc_provider/api/base_controller.rb | 6 +++++- .../dfc_provider/api/catalog_items_controller.rb | 2 +- .../controllers/dfc_provider/api/enterprises_controller.rb | 6 +++--- .../dfc_provider/api/supplied_products_controller.rb | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb index a896428ba4..c0f1c05a04 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb @@ -27,7 +27,11 @@ module DfcProvider end def check_enterprise - @enterprise = + current_enterprise + end + + def current_enterprise + @current_enterprise ||= if params[:enterprise_id] == 'default' current_user.enterprises.first! else diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb index 6f5111159f..f709df5170 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb @@ -18,7 +18,7 @@ module DfcProvider @variant ||= Spree::Variant. joins(product: :supplier). - where('enterprises.id' => @enterprise.id). + where('enterprises.id' => current_enterprise.id). find(params[:id]) end end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb index 9a076c98af..ddf53f7152 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb @@ -5,13 +5,13 @@ module DfcProvider module Api class EnterprisesController < BaseController def show - render json: @enterprise, serializer: DfcProvider::EnterpriseSerializer + render json: current_enterprise, serializer: DfcProvider::EnterpriseSerializer end private - def check_enterprise - @enterprise = + def current_enterprise + @current_enterprise ||= if params[:id] == 'default' current_user.enterprises.first! else diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb index 2c4e5c677e..b41e2ffdd7 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb @@ -14,7 +14,7 @@ module DfcProvider @variant ||= Spree::Variant. joins(product: :supplier). - where('enterprises.id' => @enterprise.id). + where('enterprises.id' => current_enterprise.id). find(params[:id]) end end From 59fb2abc5d8eb8012e93e52a2fdc0574190b05ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Wed, 2 Sep 2020 22:52:08 +0200 Subject: [PATCH 19/23] Fix inheritance issue with specs on Semaphore --- .../app/controllers/dfc_provider/api/base_controller.rb | 2 +- .../controllers/dfc_provider/api/catalog_items_controller.rb | 2 +- .../app/controllers/dfc_provider/api/enterprises_controller.rb | 2 +- .../app/controllers/dfc_provider/api/people_controller.rb | 2 +- .../dfc_provider/api/supplied_products_controller.rb | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb index c0f1c05a04..497daf728a 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb @@ -3,7 +3,7 @@ # Controller used to provide the API products for the DFC application module DfcProvider module Api - class BaseController < ::ActionController::Base + class BaseController < ActionController::Base rescue_from ActiveRecord::RecordNotFound, with: :not_found before_action :check_authorization, diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb index f709df5170..f701fc471d 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/catalog_items_controller.rb @@ -3,7 +3,7 @@ # Controller used to provide the API products for the DFC application module DfcProvider module Api - class CatalogItemsController < BaseController + class CatalogItemsController < DfcProvider::Api::BaseController def index render json: current_user, serializer: DfcProvider::PersonSerializer end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb index ddf53f7152..7bc7162a68 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb @@ -3,7 +3,7 @@ # Controller used to provide the CatalogItem API for the DFC application module DfcProvider module Api - class EnterprisesController < BaseController + class EnterprisesController < DfcProvider::Api::BaseController def show render json: current_enterprise, serializer: DfcProvider::EnterpriseSerializer end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb index e0d1a7432c..66b2266f2b 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb @@ -3,7 +3,7 @@ # Controller used to provide the People API for the DFC application module DfcProvider module Api - class PeopleController < BaseController + class PeopleController < DfcProvider::Api::BaseController skip_before_action :check_enterprise before_action :check_user_accessibility diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb index b41e2ffdd7..ee1d273879 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/supplied_products_controller.rb @@ -3,7 +3,7 @@ # Controller used to provide the SuppliedProducts API for the DFC application module DfcProvider module Api - class SuppliedProductsController < BaseController + class SuppliedProductsController < DfcProvider::Api::BaseController def show render json: variant, serializer: DfcProvider::SuppliedProductSerializer end From b60c1c90030f71504c102775175280069fec826a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 3 Sep 2020 00:50:23 +0200 Subject: [PATCH 20/23] Dry current_enterprise emtod with enterprise_id_param_name --- .../app/controllers/dfc_provider/api/base_controller.rb | 8 ++++++-- .../dfc_provider/api/enterprises_controller.rb | 9 ++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb index 497daf728a..92b9bf0f73 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/base_controller.rb @@ -32,13 +32,17 @@ module DfcProvider def current_enterprise @current_enterprise ||= - if params[:enterprise_id] == 'default' + if params[enterprise_id_param_name] == 'default' current_user.enterprises.first! else - current_user.enterprises.find(params[:enterprise_id]) + current_user.enterprises.find(params[enterprise_id_param_name]) end end + def enterprise_id_param_name + :enterprise_id + end + def current_user @current_user ||= authorization_control.process end diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb index 7bc7162a68..91cba677bb 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/enterprises_controller.rb @@ -10,13 +10,8 @@ module DfcProvider private - def current_enterprise - @current_enterprise ||= - if params[:id] == 'default' - current_user.enterprises.first! - else - current_user.enterprises.find(params[:id]) - end + def enterprise_id_param_name + :id end end end From d2c147109d071c5ed53b52614d6180bf3cb29468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 3 Sep 2020 00:55:54 +0200 Subject: [PATCH 21/23] Use Persons instead of People --- .../api/{people_controller.rb => persons_controller.rb} | 4 ++-- engines/dfc_provider/config/routes.rb | 2 +- .../{people_controller_spec.rb => persons_controller_spec.rb} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename engines/dfc_provider/app/controllers/dfc_provider/api/{people_controller.rb => persons_controller.rb} (77%) rename engines/dfc_provider/spec/controllers/dfc_provider/api/{people_controller_spec.rb => persons_controller_spec.rb} (94%) diff --git a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/api/persons_controller.rb similarity index 77% rename from engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb rename to engines/dfc_provider/app/controllers/dfc_provider/api/persons_controller.rb index 66b2266f2b..e4c1468785 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/api/people_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/api/persons_controller.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -# Controller used to provide the People API for the DFC application +# Controller used to provide the Persons API for the DFC application module DfcProvider module Api - class PeopleController < DfcProvider::Api::BaseController + class PersonsController < DfcProvider::Api::BaseController skip_before_action :check_enterprise before_action :check_user_accessibility diff --git a/engines/dfc_provider/config/routes.rb b/engines/dfc_provider/config/routes.rb index 1bca54f06b..b9ea25e15e 100644 --- a/engines/dfc_provider/config/routes.rb +++ b/engines/dfc_provider/config/routes.rb @@ -7,7 +7,7 @@ DfcProvider::Engine.routes.draw do resources :catalog_items, only: [:index, :show] resources :supplied_products, only: [:show] end - resources :people, only: [:show] + resources :persons, only: [:show] end end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/people_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/persons_controller_spec.rb similarity index 94% rename from engines/dfc_provider/spec/controllers/dfc_provider/api/people_controller_spec.rb rename to engines/dfc_provider/spec/controllers/dfc_provider/api/persons_controller_spec.rb index 95a5610aec..0098061591 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/people_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/persons_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe DfcProvider::Api::PeopleController, type: :controller do +describe DfcProvider::Api::PersonsController, type: :controller do render_views let!(:user) { create(:user) } From d11d67561f4f6959787e9cdcfbb11bfa23bfd92b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 3 Sep 2020 00:58:54 +0200 Subject: [PATCH 22/23] Remove extra delegation in serializers --- .../app/serializers/dfc_provider/catalog_item_serializer.rb | 2 -- .../app/serializers/dfc_provider/offer_serializer.rb | 2 -- 2 files changed, 4 deletions(-) diff --git a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb index 0b98993305..12038e8ffc 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/catalog_item_serializer.rb @@ -13,8 +13,6 @@ module DfcProvider serializer: DfcProvider::OfferSerializer, key: 'dfc:offeredThrough' - delegate :sku, to: :object - def id dfc_provider_routes.api_dfc_provider_enterprise_catalog_item_url( enterprise_id: object.product.supplier_id, diff --git a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb index 50896125bf..bcb67376ae 100644 --- a/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb +++ b/engines/dfc_provider/app/serializers/dfc_provider/offer_serializer.rb @@ -10,8 +10,6 @@ module DfcProvider attribute :price, key: 'dfc:price' attribute :stock_limitation, key: 'dfc:stockLimitation' - delegate :price, to: :object - def id "/offers/#{object.id}" end From 52d82d0a96e7d34fc68627e01fab661c203e672c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Turbelin?= Date: Thu, 3 Sep 2020 00:59:21 +0200 Subject: [PATCH 23/23] Use not found instead of 404 for spec descriptions --- .../dfc_provider/api/catalog_items_controller_spec.rb | 4 ++-- .../spec/controllers/dfc_provider/api/enterprises_spec.rb | 2 +- .../controllers/dfc_provider/api/persons_controller_spec.rb | 2 +- .../dfc_provider/api/supplied_products_controller_spec.rb | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb index 7b5d42865a..c3637b0f1e 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/catalog_items_controller_spec.rb @@ -73,7 +73,7 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do context 'without a recorded enterprise' do let(:enterprise) { create(:enterprise) } - it 'returns not_found head' do + it 'is not found' do api_get :index, enterprise_id: 'default' expect(response.status).to eq 404 end @@ -140,7 +140,7 @@ describe DfcProvider::Api::CatalogItemsController, type: :controller do id: create(:simple_product).variants.first.id end - it 'returns a 404 error' do + it 'is not found' do expect(response.status).to eq 404 end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb index 691fcb4e0e..27cb0b6311 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/enterprises_spec.rb @@ -43,7 +43,7 @@ describe DfcProvider::Api::EnterprisesController, type: :controller do context 'given with a wrong id' do before { api_get :show, id: 999 } - it 'returns 404' do + it 'is not found' do expect(response.status).to eq 404 end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/persons_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/persons_controller_spec.rb index 0098061591..617c6d08ec 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/persons_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/persons_controller_spec.rb @@ -38,7 +38,7 @@ describe DfcProvider::Api::PersonsController, type: :controller do context 'with an other user id' do before { api_get :show, id: create(:user).id } - it 'returns 404' do + it 'is not found' do expect(response.status).to eq 404 end end diff --git a/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb index de594d276d..98bee69055 100644 --- a/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb +++ b/engines/dfc_provider/spec/controllers/dfc_provider/api/supplied_products_controller_spec.rb @@ -44,7 +44,7 @@ describe DfcProvider::Api::SuppliedProductsController, type: :controller do context 'given with a wrong id' do before { api_get :show, id: 999 } - it 'returns 404' do + it 'is not found' do expect(response.status).to eq 404 end end