From 1cc1e4b29b01e541364754534cd492cd3a504fb1 Mon Sep 17 00:00:00 2001 From: Jane Sandberg Date: Fri, 13 Sep 2024 09:57:09 -0700 Subject: [PATCH] Finish refactoring router into an array of ServiceEligibility objects --- app/models/requests/router.rb | 65 +++++++------------ .../service_eligibility/abstract_on_shelf.rb | 1 + .../requests/service_eligibility/aeon.rb | 24 +++++++ .../service_eligibility/recap/digitize.rb | 3 +- .../service_eligibility/recap/pickup.rb | 3 +- spec/models/requests/router_spec.rb | 1 + .../requests/service_eligibility/aeon_spec.rb | 17 +++++ .../service_eligibility/annex_spec.rb | 2 + .../on_shelf_digitize_spec.rb | 2 + .../on_shelf_pickup_spec.rb | 2 + .../recap/digitize_spec.rb | 21 +++++- .../service_eligibility/recap/pickup_spec.rb | 23 ++++++- 12 files changed, 115 insertions(+), 49 deletions(-) create mode 100644 app/models/requests/service_eligibility/aeon.rb create mode 100644 spec/models/requests/service_eligibility/aeon_spec.rb diff --git a/app/models/requests/router.rb b/app/models/requests/router.rb index 136b4116f..2e9fdf003 100644 --- a/app/models/requests/router.rb +++ b/app/models/requests/router.rb @@ -13,7 +13,6 @@ def initialize(requestable:, user:, any_loanable: false) end # Current Service Types Assigned - # :online - material is available online at a URL # :aeon - material is stored in a location where it can be requested via Aeon # :annex - material is stored in an Annex location # :on_shelf - material is stored in a campus library location @@ -37,54 +36,34 @@ def routed_request requestable end - # top level call, returns a hash of symbols with service objects as values + # returns a hash of symbols with service objects as values # services[:service_name] = Requests::Service::GenericService def calculate_services - if (requestable.alma_managed? || requestable.partner_holding?) && !requestable.aeon? - calculate_alma_or_scsb_services - else # Default Service is Aeon - ['aeon'] - end + eligibility_checks.select(&:eligible?).map(&:to_s) end private - def calculate_alma_or_scsb_services - return [] unless auth_user? - if requestable.charged? - calculate_unavailable_services - else - [ - ServiceEligibility::OnOrder.new(requestable:, user:), - ServiceEligibility::Annex.new(requestable:, user:), - ServiceEligibility::OnShelfDigitize.new(requestable:, user:), - ServiceEligibility::OnShelfPickup.new(requestable:, user:), - ServiceEligibility::ClancyUnavailable.new(user:, requestable:), - ServiceEligibility::ClancyInLibrary.new(user:, requestable:), - ServiceEligibility::ClancyEdd.new(user:, requestable:), - ServiceEligibility::InProcess.new(requestable:, user:), - ServiceEligibility::MarquandInLibrary.new(user:, requestable:), - ServiceEligibility::MarquandEdd.new(user:, requestable:), - ServiceEligibility::Recap::NoItems.new(requestable:, user:), - ServiceEligibility::Recap::InLibrary.new(requestable:, user:), - ServiceEligibility::Recap::AskMe.new(requestable:, user:), - ServiceEligibility::Recap::Digitize.new(requestable:, user:), - ServiceEligibility::Recap::Pickup.new(requestable:, user:) - ].select(&:eligible?).map(&:to_s) - end - end - - def calculate_unavailable_services - ill_eligibility = ServiceEligibility::ILL.new(requestable:, user:, any_loanable:) - if ill_eligibility.eligible? - [ill_eligibility.to_s] - else - [] - end - end - - def auth_user? - cas_provider? || alma_provider? + def eligibility_checks + [ + ServiceEligibility::ILL.new(requestable:, user:, any_loanable:), + ServiceEligibility::OnOrder.new(requestable:, user:), + ServiceEligibility::Annex.new(requestable:, user:), + ServiceEligibility::OnShelfDigitize.new(requestable:, user:), + ServiceEligibility::OnShelfPickup.new(requestable:, user:), + ServiceEligibility::ClancyUnavailable.new(user:, requestable:), + ServiceEligibility::ClancyInLibrary.new(user:, requestable:), + ServiceEligibility::ClancyEdd.new(user:, requestable:), + ServiceEligibility::InProcess.new(requestable:, user:), + ServiceEligibility::MarquandInLibrary.new(user:, requestable:), + ServiceEligibility::MarquandEdd.new(user:, requestable:), + ServiceEligibility::Recap::NoItems.new(requestable:, user:), + ServiceEligibility::Recap::InLibrary.new(requestable:, user:), + ServiceEligibility::Recap::AskMe.new(requestable:, user:), + ServiceEligibility::Recap::Digitize.new(requestable:, user:), + ServiceEligibility::Recap::Pickup.new(requestable:, user:), + ServiceEligibility::Aeon.new(requestable:) + ] end end end diff --git a/app/models/requests/service_eligibility/abstract_on_shelf.rb b/app/models/requests/service_eligibility/abstract_on_shelf.rb index ea36f2bda..b1bceca29 100644 --- a/app/models/requests/service_eligibility/abstract_on_shelf.rb +++ b/app/models/requests/service_eligibility/abstract_on_shelf.rb @@ -25,6 +25,7 @@ def on_shelf_eligible? !requestable.aeon? && !requestable.charged? && !requestable.in_process? && !requestable.on_order? && + requestable.alma_managed? && !(requestable.recap? || requestable.recap_pf?) && !requestable.held_at_marquand_library? end diff --git a/app/models/requests/service_eligibility/aeon.rb b/app/models/requests/service_eligibility/aeon.rb new file mode 100644 index 000000000..6e8a9fff7 --- /dev/null +++ b/app/models/requests/service_eligibility/aeon.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +module Requests + module ServiceEligibility + # This class is responsible for determining if a specific + # resource can be requested via Aeon + class Aeon + def initialize(requestable:) + @requestable = requestable + end + + def to_s + 'aeon' + end + + def eligible? + requestable.aeon? || !(requestable.alma_managed? || requestable.partner_holding?) + end + + private + + attr_reader :requestable + end + end +end diff --git a/app/models/requests/service_eligibility/recap/digitize.rb b/app/models/requests/service_eligibility/recap/digitize.rb index 259e83c6d..75e2e3cbf 100644 --- a/app/models/requests/service_eligibility/recap/digitize.rb +++ b/app/models/requests/service_eligibility/recap/digitize.rb @@ -20,7 +20,8 @@ def requestable_eligible? !requestable.recap_pf? && requestable.recap_edd? && requestable.item_data? && - !requestable.scsb_in_library_use? + !requestable.scsb_in_library_use? && + !requestable.charged? end end end diff --git a/app/models/requests/service_eligibility/recap/pickup.rb b/app/models/requests/service_eligibility/recap/pickup.rb index 58d12bd71..fada129fd 100644 --- a/app/models/requests/service_eligibility/recap/pickup.rb +++ b/app/models/requests/service_eligibility/recap/pickup.rb @@ -20,7 +20,8 @@ def requestable_eligible? !requestable.recap_pf? && !requestable.holding_library_in_library_only? && !(!requestable.circulates? && !requestable.recap_edd?) && - !(requestable.scsb_in_library_use? && requestable.item[:collection_code] != "MR") + !(requestable.scsb_in_library_use? && requestable.item[:collection_code] != "MR") && + !requestable.charged? end def patron_eligible? diff --git a/spec/models/requests/router_spec.rb b/spec/models/requests/router_spec.rb index fc6a62f93..723d4c13d 100644 --- a/spec/models/requests/router_spec.rb +++ b/spec/models/requests/router_spec.rb @@ -232,6 +232,7 @@ before do stubbed_questions[:alma_managed?] = false stubbed_questions[:partner_holding?] = false + stubbed_questions[:circulates?] = true end it "returns aeon in the services" do expect(router.calculate_services).to eq(['aeon']) diff --git a/spec/models/requests/service_eligibility/aeon_spec.rb b/spec/models/requests/service_eligibility/aeon_spec.rb new file mode 100644 index 000000000..4c68a2bab --- /dev/null +++ b/spec/models/requests/service_eligibility/aeon_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true +require 'rails_helper' + +RSpec.describe Requests::ServiceEligibility::Aeon, requests: true do + describe '#eligible?' do + it 'returns true if Alma-managed and aeon true' do + requestable = instance_double(Requests::Requestable) + allow(requestable).to receive_messages( + alma_managed?: true, + aeon?: true + ) + eligibility = described_class.new(requestable:) + + expect(eligibility.eligible?).to be(true) + end + end +end diff --git a/spec/models/requests/service_eligibility/annex_spec.rb b/spec/models/requests/service_eligibility/annex_spec.rb index 8e7fb1046..189951d86 100644 --- a/spec/models/requests/service_eligibility/annex_spec.rb +++ b/spec/models/requests/service_eligibility/annex_spec.rb @@ -11,6 +11,7 @@ in_process?: false, on_order?: false, annex?: true, + alma_managed?: true, recap?: false, recap_pf?: false, held_at_marquand_library?: false @@ -27,6 +28,7 @@ in_process?: false, on_order?: false, annex?: false, + alma_managed?: true, recap?: false, recap_pf?: false, held_at_marquand_library?: false diff --git a/spec/models/requests/service_eligibility/on_shelf_digitize_spec.rb b/spec/models/requests/service_eligibility/on_shelf_digitize_spec.rb index fb8ec3df2..66f2964b4 100644 --- a/spec/models/requests/service_eligibility/on_shelf_digitize_spec.rb +++ b/spec/models/requests/service_eligibility/on_shelf_digitize_spec.rb @@ -10,6 +10,7 @@ charged?: false, in_process?: false, on_order?: false, + alma_managed?: true, annex?: false, recap?: false, recap_pf?: false, @@ -25,6 +26,7 @@ aeon?: false, charged?: false, in_process?: false, + alma_managed?: true, on_order?: false, annex?: true, recap?: false, diff --git a/spec/models/requests/service_eligibility/on_shelf_pickup_spec.rb b/spec/models/requests/service_eligibility/on_shelf_pickup_spec.rb index 97334fcda..d6d7b057d 100644 --- a/spec/models/requests/service_eligibility/on_shelf_pickup_spec.rb +++ b/spec/models/requests/service_eligibility/on_shelf_pickup_spec.rb @@ -7,6 +7,7 @@ requestable = instance_double(Requests::Requestable) allow(requestable).to receive_messages( aeon?: false, + alma_managed?: true, charged?: false, in_process?: false, circulates?: true, @@ -25,6 +26,7 @@ allow(requestable).to receive_messages( aeon?: false, charged?: false, + alma_managed?: true, in_process?: false, circulates?: true, on_order?: false, diff --git a/spec/models/requests/service_eligibility/recap/digitize_spec.rb b/spec/models/requests/service_eligibility/recap/digitize_spec.rb index 72e37b01f..6f7ce66d3 100644 --- a/spec/models/requests/service_eligibility/recap/digitize_spec.rb +++ b/spec/models/requests/service_eligibility/recap/digitize_spec.rb @@ -10,7 +10,8 @@ recap_pf?: false, recap_edd?: true, item_data?: true, - scsb_in_library_use?: false + scsb_in_library_use?: false, + charged?: false ) eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) @@ -22,7 +23,23 @@ allow(requestable).to receive_messages( recap?: true, recap_pf?: false, - recap_edd?: false + recap_edd?: false, + charged?: false + ) + eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) + + expect(eligibility.eligible?).to be(false) + end + + it 'returns false if the requestable is charged' do + requestable = instance_double(Requests::Requestable) + allow(requestable).to receive_messages( + charged?: true, + recap?: true, + recap_pf?: false, + recap_edd?: true, + item_data?: true, + scsb_in_library_use?: false ) eligibility = described_class.new(requestable:, user: FactoryBot.create(:user)) diff --git a/spec/models/requests/service_eligibility/recap/pickup_spec.rb b/spec/models/requests/service_eligibility/recap/pickup_spec.rb index c8c3757f6..ca6061d81 100644 --- a/spec/models/requests/service_eligibility/recap/pickup_spec.rb +++ b/spec/models/requests/service_eligibility/recap/pickup_spec.rb @@ -13,7 +13,8 @@ circulates?: true, eligible_for_library_services?: true, item_data?: true, - scsb_in_library_use?: false + scsb_in_library_use?: false, + charged?: false ) eligibility = described_class.new(requestable:, user:) @@ -28,7 +29,25 @@ holding_library_in_library_only?: true, circulates?: false, eligible_for_library_services?: false, - item_data?: true + item_data?: true, + charged?: false + ) + eligibility = described_class.new(requestable:, user:) + + expect(eligibility.eligible?).to be(false) + end + + it 'returns false if the item is charged' do + requestable = instance_double(Requests::Requestable) + allow(requestable).to receive_messages( + charged?: true, + recap?: true, + recap_pf?: false, + holding_library_in_library_only?: false, + circulates?: true, + eligible_for_library_services?: true, + item_data?: true, + scsb_in_library_use?: false ) eligibility = described_class.new(requestable:, user:)