mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
Product group can be present or just linked
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!(
|
||||
|
||||
Reference in New Issue
Block a user