From f7fda9ead6f3c5656731b1b2caf4cf8992e8c29f Mon Sep 17 00:00:00 2001 From: allthesignals Date: Fri, 7 Feb 2025 16:46:03 -0500 Subject: [PATCH 1/8] First sketch of multi-provider search --- .../cbv/employer_searches_controller.rb | 6 ++- app/app/services/argyle_service.rb | 43 +++++++++++++++++++ app/app/services/provider_search_service.rb | 35 +++++++++++++++ .../cbv/employer_searches/_employer.html.erb | 12 +++--- app/config/site-config.yml | 6 +++ app/lib/site_config.rb | 2 + 6 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 app/app/services/argyle_service.rb create mode 100644 app/app/services/provider_search_service.rb diff --git a/app/app/controllers/cbv/employer_searches_controller.rb b/app/app/controllers/cbv/employer_searches_controller.rb index c90041177..b58015325 100644 --- a/app/app/controllers/cbv/employer_searches_controller.rb +++ b/app/app/controllers/cbv/employer_searches_controller.rb @@ -6,7 +6,7 @@ class Cbv::EmployerSearchesController < Cbv::BaseController def show @query = search_params[:query] - @employers = @query.blank? ? [] : fetch_employers(@query) + @employers = @query.blank? ? [] : provider_search(@query) @has_pinwheel_account = @cbv_flow.pinwheel_accounts.any? @selected_tab = search_params[:type] || "payroll" @@ -20,6 +20,10 @@ def show private + def provider_search(query = "") + ProviderSearchService.new(@cbv_flow.site_id).search(query) + end + def search_params params.slice(:query, :type) end diff --git a/app/app/services/argyle_service.rb b/app/app/services/argyle_service.rb new file mode 100644 index 000000000..f582e5b99 --- /dev/null +++ b/app/app/services/argyle_service.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require "faraday" + +class ArgyleService + ENVIRONMENTS = { + sandbox: { + base_url: "https://api-sandbox.argyle.com/v2", + api_key_id: ENV["ARGYLE_API_TOKEN_SANDBOX_ID"], + api_key_secret: ENV["ARGYLE_API_TOKEN_SANDBOX_SECRET"] + } + } + + def initialize(environment, api_key_id = nil, api_key_secret = nil) + @api_key_id = api_key_id || ENVIRONMENTS.fetch(environment.to_sym)[:api_key_id] + @api_key_secret = api_key_secret || ENVIRONMENTS.fetch(environment.to_sym)[:api_key_secret] + @environment = ENVIRONMENTS.fetch(environment.to_sym) { |env| raise KeyError.new("ArgyleService unknown environment: #{env}") } + + client_options = { + request: { + open_timeout: 5, + timeout: 5, + params_encoder: Faraday::FlatParamsEncoder + }, + url: @environment[:base_url] + } + @http = Faraday.new(client_options) do |conn| + conn.set_basic_auth @api_key_id, @api_key_secret + conn.response :raise_error + conn.response :json, content_type: "application/json" + conn.response :logger, + Rails.logger, + headers: true, + bodies: true, + log_level: :debug + end + end + + # Fetch all Argyle items + def items(query = nil) + @http.get("items", { q: query }).body + end +end diff --git a/app/app/services/provider_search_service.rb b/app/app/services/provider_search_service.rb new file mode 100644 index 000000000..dde2ee992 --- /dev/null +++ b/app/app/services/provider_search_service.rb @@ -0,0 +1,35 @@ +class ProviderSearchService + PROVIDER_RESULT = Struct.new(:provider_name, :provider_options, :name, :logo_url, keyword_init: true) + + def initialize(client_agency_id) + set_pinwheel(client_agency_id) + set_argyle(client_agency_id) + end + + def search(query = "") + [ + *@argyle.items(query)["results"].map do |result| + PROVIDER_RESULT.new(provider_name: :argyle, provider_options: { response_type: result["kind"], provider_id: result["id"] }, name: result["name"], logo_url: result["logo_url"]) + end, + *@pinwheel.fetch_items(q: query)["data"].map do |result| + PROVIDER_RESULT.new(provider_name: :pinwheel, provider_options: { response_type: result["response_type"], provider_id: result["id"] }, name: result["name"], logo_url: result["logo_url"]) + end + ] + end + + private + + def site_config + Rails.application.config.sites + end + + def set_pinwheel(client_agency_id) + environment = site_config[client_agency_id].pinwheel_environment + @pinwheel ||= PinwheelService.new(environment) + end + + def set_argyle(client_agency_id) + environment = site_config[client_agency_id].argyle_environment + @argyle ||= ArgyleService.new(environment) + end +end diff --git a/app/app/views/cbv/employer_searches/_employer.html.erb b/app/app/views/cbv/employer_searches/_employer.html.erb index 7a2fd0823..d9929f318 100644 --- a/app/app/views/cbv/employer_searches/_employer.html.erb +++ b/app/app/views/cbv/employer_searches/_employer.html.erb @@ -9,13 +9,13 @@
-

<%= employer["name"] %>

+

<%= employer.name %>