Product group can be present or just linked

This commit is contained in:
Maikel Linke
2025-01-24 17:14:51 +11:00
parent 516759062f
commit fba7c24ebd
3 changed files with 19 additions and 17 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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!(