From ef08ae49fe74e2c525fde31b9df032708ade35ff Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Wed, 18 Dec 2024 15:34:42 +1100 Subject: [PATCH] DRY DFC catalog logic for re-use --- .../admin/dfc_product_imports_controller.rb | 5 ++-- app/jobs/stock_sync_job.rb | 4 +--- .../dfc_provider/app/services/dfc_catalog.rb | 13 ++++++++++ .../spec/services/dfc_catalog_spec.rb | 24 +++++++++++++++++++ 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 engines/dfc_provider/app/services/dfc_catalog.rb create mode 100644 engines/dfc_provider/spec/services/dfc_catalog_spec.rb diff --git a/app/controllers/admin/dfc_product_imports_controller.rb b/app/controllers/admin/dfc_product_imports_controller.rb index ab3b819c4f..c17a428c75 100644 --- a/app/controllers/admin/dfc_product_imports_controller.rb +++ b/app/controllers/admin/dfc_product_imports_controller.rb @@ -20,12 +20,11 @@ module Admin catalog_url = params.require(:catalog_url) broker = FdcOfferBroker.new(spree_current_user, catalog_url) + catalog = DfcCatalog.new(broker.catalog) # * First step: import all products for given enterprise. # * Second step: render table and let user decide which ones to import. - imported = broker.catalog.map do |subject| - next unless subject.is_a? DataFoodConsortium::Connector::SuppliedProduct - + imported = catalog.products.map do |subject| adjust_to_wholesale_price(broker, subject) existing_variant = enterprise.supplied_variants.linked_to(subject.semanticId) diff --git a/app/jobs/stock_sync_job.rb b/app/jobs/stock_sync_job.rb index d4df9c3c61..1572731e0c 100644 --- a/app/jobs/stock_sync_job.rb +++ b/app/jobs/stock_sync_job.rb @@ -62,9 +62,7 @@ class StockSyncJob < ApplicationJob json_catalog = DfcRequest.new(user).call(catalog_id) graph = DfcIo.import(json_catalog) - graph.select do |subject| - subject.is_a? DataFoodConsortium::Connector::SuppliedProduct - end + DfcCatalog.new(graph).products end def linked_variants(enterprises, product_ids) diff --git a/engines/dfc_provider/app/services/dfc_catalog.rb b/engines/dfc_provider/app/services/dfc_catalog.rb new file mode 100644 index 0000000000..ace46a51d0 --- /dev/null +++ b/engines/dfc_provider/app/services/dfc_catalog.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class DfcCatalog + def initialize(graph) + @graph = graph + end + + def products + @products ||= @graph.select do |subject| + subject.is_a? DataFoodConsortium::Connector::SuppliedProduct + end + end +end diff --git a/engines/dfc_provider/spec/services/dfc_catalog_spec.rb b/engines/dfc_provider/spec/services/dfc_catalog_spec.rb new file mode 100644 index 0000000000..c050e9f5d7 --- /dev/null +++ b/engines/dfc_provider/spec/services/dfc_catalog_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require_relative "../spec_helper" + +RSpec.describe DfcCatalog do + subject(:catalog) { DfcCatalog.new(fdc_catalog_graph) } + let(:fdc_catalog_graph) { + VCR.use_cassette(:fdc_catalog) { broker.catalog } + } + let(:broker) { FdcOfferBroker.new(user, catalog_url) } + let(:user) { build(:testdfc_user) } + let(:catalog_url) { + "https://env-0105831.jcloud-ver-jpe.ik-server.com/api/dfc/Enterprises/test-hodmedod/SuppliedProducts" + } + + describe "#products" do + let(:products) { catalog.products } + + it "returns only products" do + expect(products.count).to eq 4 + expect(products.map(&:semanticType).uniq).to eq ["dfc-b:SuppliedProduct"] + end + end +end