diff --git a/engines/dfc_provider/app/services/supplied_product_builder.rb b/engines/dfc_provider/app/services/supplied_product_builder.rb index 63398b3f89..d2d1751be2 100644 --- a/engines/dfc_provider/app/services/supplied_product_builder.rb +++ b/engines/dfc_provider/app/services/supplied_product_builder.rb @@ -13,10 +13,7 @@ class SuppliedProductBuilder < DfcBuilder variant.supplier_id, spree_product_id: variant.product_id ) - product_group_id = urls.enterprise_product_group_url( - enterprise_id: variant.supplier_id, - id: variant.product_id, - ) + product_group = ProductGroupBuilder.product_group(variant.product) DfcProvider::SuppliedProduct.new( semantic_id(variant), @@ -24,7 +21,7 @@ class SuppliedProductBuilder < DfcBuilder description: variant.description, productType: product_type(variant), quantity: QuantitativeValueBuilder.quantity(variant), - isVariantOf: [product_group_id], + isVariantOf: [product_group], spree_product_uri: product_uri, spree_product_id: variant.product.id, image_url: variant.product&.image&.url(:product) diff --git a/engines/dfc_provider/app/services/supplied_product_importer.rb b/engines/dfc_provider/app/services/supplied_product_importer.rb index e887869de9..9d7920e820 100644 --- a/engines/dfc_provider/app/services/supplied_product_importer.rb +++ b/engines/dfc_provider/app/services/supplied_product_importer.rb @@ -51,12 +51,14 @@ class SuppliedProductImporter < DfcBuilder def self.spree_product(supplied_product, supplier) supplied_product.isVariantOf.lazy.map do |group| - group_id = group.semanticId + # We may have an object or just the id here: + group_id = group.try(:semanticId) || group + id = begin route = Rails.application.routes.recognize_path(group_id) # Check that the given URI points to us: - next if group_id != urls.enterprise_technical_product_url(route) + next if group_id != urls.enterprise_product_group_url(route) route[:id] rescue ActionController::RoutingError @@ -68,7 +70,9 @@ class SuppliedProductImporter < DfcBuilder end def self.spree_product_linked(supplied_product, supplier) - semantic_ids = supplied_product.isVariantOf.map(&:semanticId) + semantic_ids = supplied_product.isVariantOf.map do |id_or_object| + id_or_object.try(:semanticId) || id_or_object + end supplier.supplied_products.includes(:semantic_link) .where(semantic_link: { semantic_id: semantic_ids }) .first @@ -121,7 +125,8 @@ class SuppliedProductImporter < DfcBuilder end def self.semantic_link(supplied_product) - semantic_id = supplied_product.isVariantOf.first&.semanticId + group = supplied_product.isVariantOf.first + semantic_id = group.try(:semanticId) || semantic_id SemanticLink.new(semantic_id:) if semantic_id.present? end diff --git a/engines/dfc_provider/spec/services/supplied_product_importer_spec.rb b/engines/dfc_provider/spec/services/supplied_product_importer_spec.rb index 9f6bd6a98c..ae2f0083b5 100644 --- a/engines/dfc_provider/spec/services/supplied_product_importer_spec.rb +++ b/engines/dfc_provider/spec/services/supplied_product_importer_spec.rb @@ -230,12 +230,12 @@ RSpec.describe SuppliedProductImporter do ), productType: product_type, spree_product_uri: "http://another.host/api/dfc/enterprises/10/supplied_products/50", - isVariantOf: [technical_product], + isVariantOf: [product_group], ) end - let(:technical_product) do - DataFoodConsortium::Connector::TechnicalProduct.new( - "http://test.host/api/dfc/enterprises/7/technical_products/6" + let(:product_group) do + DataFoodConsortium::Connector::SuppliedProduct.new( + "http://test.host/api/dfc/enterprises/7/product_groups/6" ) end @@ -250,7 +250,7 @@ RSpec.describe SuppliedProductImporter do expect(imported_product.description).to eq("Awesome tomato") expect(imported_product.variant_unit).to eq("weight") expect(imported_product.semantic_link.semantic_id) - .to eq "http://test.host/api/dfc/enterprises/7/technical_products/6" + .to eq "http://test.host/api/dfc/enterprises/7/product_groups/6" end end end @@ -272,8 +272,8 @@ RSpec.describe SuppliedProductImporter do it "returns a product referenced by semantic id" do variant.save! supplied_product.isVariantOf << - DataFoodConsortium::Connector::TechnicalProduct.new( - "http://test.host/api/dfc/enterprises/7/technical_products/6" + DataFoodConsortium::Connector::SuppliedProduct.new( + "http://test.host/api/dfc/enterprises/7/product_groups/6" ) expect(result).to eq spree_product end @@ -281,7 +281,7 @@ RSpec.describe SuppliedProductImporter do it "returns a product referenced by external URI" do variant.save! supplied_product.isVariantOf << - DataFoodConsortium::Connector::TechnicalProduct.new( + DataFoodConsortium::Connector::SuppliedProduct.new( "http://example.net/product_group" ) SemanticLink.create!(