class Creditsafe::Client

Constants

ENVIRONMENTS

Public Class Methods

new(username: nil, password: nil, savon_opts: {}, environment: :live, log_level: :warn) click to toggle source
# File lib/creditsafe/client.rb, line 20
def initialize(username: nil, password: nil, savon_opts: {},
               environment: :live, log_level: :warn)
  raise ArgumentError, "Username must be provided" if username.nil?
  raise ArgumentError, "Password must be provided" if password.nil?

  unless ENVIRONMENTS.include?(environment.to_sym)
    raise ArgumentError, "Environment needs to be one of #{ENVIRONMENTS.join('/')}"
  end

  @environment = environment.to_s
  @log_level = log_level
  @username = username
  @password = password
  @savon_opts = savon_opts
end

Public Instance Methods

company_report(creditsafe_id, custom_data: nil) click to toggle source
# File lib/creditsafe/client.rb, line 48
def company_report(creditsafe_id, custom_data: nil)
  request =
    Creditsafe::Request::CompanyReport.new(creditsafe_id, custom_data)
  response = invoke_soap(:retrieve_company_online_report, request.message)

  response.
    fetch(:retrieve_company_online_report_response).
    fetch(:retrieve_company_online_report_result).
    fetch(:reports).
    fetch(:report)
end
find_company(search_criteria = {}) click to toggle source
# File lib/creditsafe/client.rb, line 36
def find_company(search_criteria = {})
  request = Creditsafe::Request::FindCompany.new(search_criteria)
  response = invoke_soap(:find_companies, request.message)

  companies = response.
    fetch(:find_companies_response).
    fetch(:find_companies_result).
    fetch(:companies)

  companies.nil? ? nil : companies.fetch(:company)
end
inspect() click to toggle source
# File lib/creditsafe/client.rb, line 60
def inspect
  "#<#{self.class} @username='#{@username}'>"
end

Private Instance Methods

auth_header() click to toggle source
# File lib/creditsafe/client.rb, line 137
def auth_header
  auth_value = "Basic " + Base64.encode64("#{@username}:#{@password}").chomp
  { "Authorization" => auth_value }
end
build_savon_client() click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/creditsafe/client.rb, line 143
def build_savon_client
  options = {
    env_namespace: "soapenv",
    namespace_identifier: Creditsafe::Namespace::OPER,
    namespaces: Creditsafe::Namespace::ALL,
    wsdl: wsdl_path,
    headers: auth_header,
    convert_request_keys_to: :none,
    adapter: :excon,
    log: true,
    log_level: @log_level,
    pretty_print_xml: true,
  }
  Savon.client(options.merge(@savon_opts))
end
client() click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/creditsafe/client.rb, line 133
def client
  @client ||= build_savon_client
end
handle_error(error) click to toggle source

There's a potential bug in the creditsafe API where they actually return an HTTP 401 if you're unauthorized, hence the sad special case below

rubocop:disable Metrics/MethodLength

# File lib/creditsafe/client.rb, line 116
def handle_error(error)
  case error
  when Savon::SOAPFault
    return UnknownApiError.new(error.message)
  when Savon::HTTPError
    if error.to_hash[:code] == 401
      return AccountError.new("Unauthorized: invalid credentials")
    end

    return UnknownApiError.new(error.message)
  when Excon::Errors::Error
    return HttpError.new("Error making HTTP request: #{error.message}")
  end
  error
end
handle_message_for_response(response) click to toggle source
# File lib/creditsafe/client.rb, line 66
def handle_message_for_response(response)
  [
    *response.xpath("//q1:Message"),
    *response.xpath("//xmlns:Message"),
  ].each do |message|
    api_message = Creditsafe::Messages.for_code(message.attributes["Code"].value)

    api_error_message = api_message.message
    api_error_message += " (#{message.text})" unless message.text.blank?

    raise api_message.error_class, api_error_message if api_message.error?
  end
end
invoke_soap(message_type, message) click to toggle source

rubocop:disable Style/RescueStandardError rubocop:disable Metrics/MethodLength rubocop:disable Metrics/AbcSize

# File lib/creditsafe/client.rb, line 83
def invoke_soap(message_type, message)
  started = Time.now
  notification_payload = { request: message }

  response = client.call(message_type, message: message)
  handle_message_for_response(response)
  notification_payload[:response] = response.body
rescue Excon::Errors::Timeout => raw_error
  notification_payload[:error] = handle_error(raw_error)
  raise TimeoutError
rescue Excon::Errors::BadGateway => raw_error
  notification_payload[:error] = handle_error(raw_error)
  raise BadGatewayError
rescue => raw_error
  processed_error = handle_error(raw_error)
  notification_payload[:error] = processed_error
  raise processed_error
ensure
  publish("creditsafe.#{message_type}", started, Time.now,
          SecureRandom.hex(10), notification_payload)
end
publish(*args) click to toggle source

rubocop:enable Metrics/AbcSize rubocop:enable Metrics/MethodLength rubocop:enable Style/RescueStandardError

# File lib/creditsafe/client.rb, line 108
def publish(*args)
  ActiveSupport::Notifications.publish(*args)
end
wsdl_path() click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/creditsafe/client.rb, line 160
def wsdl_path
  root_dir = File.join(File.dirname(__FILE__), "..", "..")
  File.join(root_dir, "data", "creditsafe-#{@environment}.xml")
end