From 7f62b49da59a060b4f0fae3b949f8ec8e3920245 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Tue, 17 Sep 2024 11:56:55 +1000 Subject: [PATCH] Move catalog loading to where it's needed --- app/jobs/backorder_job.rb | 8 +------- app/jobs/complete_backorder_job.rb | 2 +- app/services/fdc_offer_broker.rb | 19 +++++++++++++++---- spec/jobs/complete_backorder_job_spec.rb | 6 ++++-- spec/services/fdc_backorderer_spec.rb | 8 ++++---- spec/services/fdc_offer_broker_spec.rb | 4 ++-- 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/jobs/backorder_job.rb b/app/jobs/backorder_job.rb index c949425513..a15873dfde 100644 --- a/app/jobs/backorder_job.rb +++ b/app/jobs/backorder_job.rb @@ -75,13 +75,7 @@ class BackorderJob < ApplicationJob end def self.load_broker(user, urls) - FdcOfferBroker.new(load_catalog(user, urls)) - end - - def self.load_catalog(user, urls) - api = DfcRequest.new(user) - catalog_json = api.call(urls.catalog_url) - DfcIo.import(catalog_json) + FdcOfferBroker.new(user, urls) end def self.place_order(user, order, orderer, backorder) diff --git a/app/jobs/complete_backorder_job.rb b/app/jobs/complete_backorder_job.rb index 0f51e0ea76..e4ffd836d1 100644 --- a/app/jobs/complete_backorder_job.rb +++ b/app/jobs/complete_backorder_job.rb @@ -31,7 +31,7 @@ class CompleteBackorderJob < ApplicationJob # But stock levels could also have been adjusted manually. So we review all # quantities before finalising the order. def adjust_quantities(user, order, urls, variants) - broker = FdcOfferBroker.new(BackorderJob.load_catalog(user, urls)) + broker = FdcOfferBroker.new(user, urls) order.lines.each do |line| line.quantity = line.quantity.to_i diff --git a/app/services/fdc_offer_broker.rb b/app/services/fdc_offer_broker.rb index f7280798f8..ee7814463e 100644 --- a/app/services/fdc_offer_broker.rb +++ b/app/services/fdc_offer_broker.rb @@ -6,8 +6,19 @@ class FdcOfferBroker Solution = Struct.new(:product, :factor, :offer) RetailSolution = Struct.new(:retail_product_id, :factor) - def initialize(catalog) - @catalog = catalog + def self.load_catalog(user, urls) + api = DfcRequest.new(user) + catalog_json = api.call(urls.catalog_url) + DfcIo.import(catalog_json) + end + + def initialize(user, urls) + @user = user + @urls = urls + end + + def catalog + @catalog ||= self.class.load_catalog(@user, @urls) end def best_offer(product_id) @@ -61,7 +72,7 @@ class FdcOfferBroker end def catalog_item(id) - @catalog_by_id ||= @catalog.index_by(&:semanticId) + @catalog_by_id ||= catalog.index_by(&:semanticId) @catalog_by_id[id] end @@ -71,7 +82,7 @@ class FdcOfferBroker end def production_flows - @production_flows ||= @catalog.select do |i| + @production_flows ||= catalog.select do |i| i.semanticType == "dfc-b:AsPlannedProductionFlow" end end diff --git a/spec/jobs/complete_backorder_job_spec.rb b/spec/jobs/complete_backorder_job_spec.rb index 619333a055..8c268e42e6 100644 --- a/spec/jobs/complete_backorder_job_spec.rb +++ b/spec/jobs/complete_backorder_job_spec.rb @@ -4,7 +4,9 @@ require 'spec_helper' RSpec.describe CompleteBackorderJob do let(:user) { build(:testdfc_user) } - let(:catalog) { BackorderJob.load_catalog(user, urls) } + let(:catalog) { + VCR.use_cassette(:fdc_catalog) { FdcOfferBroker.load_catalog(user, urls) } + } let(:urls) { FdcUrlBuilder.new(product_link) } let(:product_link) { "https://env-0105831.jcloud-ver-jpe.ik-server.com/api/dfc/Enterprises/test-hodmedod/SuppliedProducts/44519466467635" @@ -19,7 +21,7 @@ RSpec.describe CompleteBackorderJob do let(:orderer) { FdcBackorderer.new(user, urls) } let(:order) { backorder = orderer.find_or_build_order(ofn_order) - broker = FdcOfferBroker.new(catalog) + broker = FdcOfferBroker.new(user, urls) offer = broker.best_offer(retail_product.semanticId).offer line = orderer.find_or_build_order_line(backorder, offer) line.quantity = 3 diff --git a/spec/services/fdc_backorderer_spec.rb b/spec/services/fdc_backorderer_spec.rb index 6884b28d6c..5c65aaeb96 100644 --- a/spec/services/fdc_backorderer_spec.rb +++ b/spec/services/fdc_backorderer_spec.rb @@ -33,9 +33,9 @@ RSpec.describe FdcBackorderer do expect(backorder.lines).to eq [] # Add items and place the new order: - catalog = BackorderJob.load_catalog(order.distributor.owner, urls) + catalog = FdcOfferBroker.load_catalog(order.distributor.owner, urls) product = catalog.find { |i| i.semanticType == "dfc-b:SuppliedProduct" } - offer = FdcOfferBroker.new(nil).offer_of(product) + offer = FdcOfferBroker.new(nil, nil).offer_of(product) line = subject.find_or_build_order_line(backorder, offer) line.quantity = 3 placed_order = subject.send_order(backorder) @@ -71,7 +71,7 @@ RSpec.describe FdcBackorderer do describe "#find_or_build_order_line" do it "add quantity to an existing line item", vcr: true do - catalog = BackorderJob.load_catalog(order.distributor.owner, urls) + catalog = FdcOfferBroker.load_catalog(order.distributor.owner, urls) backorder = subject.find_or_build_order(order) existing_line = backorder.lines[0] @@ -83,7 +83,7 @@ RSpec.describe FdcBackorderer do catalog_product = catalog.find do |i| i.semanticId == ordered_product.semanticId end - catalog_offer = FdcOfferBroker.new(nil).offer_of(catalog_product) + catalog_offer = FdcOfferBroker.new(nil, nil).offer_of(catalog_product) # The API response is missing this connection: catalog_offer.offeredItem = catalog_product diff --git a/spec/services/fdc_offer_broker_spec.rb b/spec/services/fdc_offer_broker_spec.rb index a492130c6b..c556d436f0 100644 --- a/spec/services/fdc_offer_broker_spec.rb +++ b/spec/services/fdc_offer_broker_spec.rb @@ -3,9 +3,9 @@ require 'spec_helper' RSpec.describe FdcOfferBroker do - subject { FdcOfferBroker.new(catalog) } + subject { FdcOfferBroker.new(user, urls) } let(:catalog) { - VCR.use_cassette(:fdc_catalog) { BackorderJob.load_catalog(user, urls) } + VCR.use_cassette(:fdc_catalog) { subject.catalog } } let(:urls) { FdcUrlBuilder.new(product_link) } let(:product_link) {