class InContactClient::Connection

Constants

API_PATH_PREFIX
MAX_TRIES
OPEN_TIMEOUT
RETRY_SLEEP
TIMEOUT

Attributes

authorization[R]
default_data_model[R]
url[R]

Public Class Methods

new(url, authorization, options = {}) click to toggle source
# File lib/incontact_client/connection.rb, line 13
def initialize(url, authorization, options = {})
  @url                = url
  @authorization      = authorization
  @default_data_model = options[:default_data_model] || OpenStruct
end

Public Instance Methods

get(path, params = {}) click to toggle source
# File lib/incontact_client/connection.rb, line 19
def get(path, params = {})
  request :get, path, params
end
post(path, payload = "", params = {}) click to toggle source
# File lib/incontact_client/connection.rb, line 23
def post(path, payload = "", params = {})
  request :post, path, params, payload
end
request(type, path, params = {}, body=nil) click to toggle source
# File lib/incontact_client/connection.rb, line 27
def request(type, path, params = {}, body=nil)
  timeout_override      = params.delete :timeout
  open_timeout_override = params.delete :open_timeout
  data_model_override   = params.delete :data_model_override
  response              = Retryable.retryable(retryable_options(params)) do
    request_with_exception_handling do
      connection.send(type) do |req|
        req.path                   = API_PATH_PREFIX + path unless path.blank?
        req.options[:timeout]      = timeout_override      || TIMEOUT
        req.options[:open_timeout] = open_timeout_override || OPEN_TIMEOUT
        req.params                 = params
        req.body                   = body.to_json unless body.blank?
      end
    end
  end
  raise_response_errors(response)
  parse_response(response, data_model_override)
end

Private Instance Methods

connection() click to toggle source
# File lib/incontact_client/connection.rb, line 74
def connection
  @connection ||= create_connection
end
create_connection() click to toggle source
# File lib/incontact_client/connection.rb, line 78
def create_connection
  Faraday.new(url: url) do |faraday|
    faraday.headers["Accept-Encoding"] = "none"
    faraday.headers["Content-Type"]    = "application/json; charset=utf-8"
    faraday.headers["Authorization"]   = authorization
    faraday.use FaradayMiddleware::ParseJson
    faraday.adapter Faraday.default_adapter
  end
end
data_model(item) click to toggle source
# File lib/incontact_client/connection.rb, line 93
def data_model(item)
  klass = name.demodulize.underscore.singularize.classify
  "InContactClient::Responses::#{klass}Response".constantize rescue nil
end
map_response_item_to_model(item, data_model_override) click to toggle source
# File lib/incontact_client/connection.rb, line 98
def map_response_item_to_model(item, data_model_override)
  return item if item.blank? || data_model_override.is_a?(FalseClass)

  # Change keys to snake case
  item = underscore_hash_keys(item)
  data_model_klass = data_model_override || default_data_model
  return item if data_model_klass.nil?
  data_model_klass.new(item)
end
parse_response(response, data_model_override) click to toggle source
# File lib/incontact_client/connection.rb, line 88
def parse_response(response, data_model_override)
  data = response.body
  map_response_item_to_model(data, data_model_override)
end
raise_response_errors(response) click to toggle source
# File lib/incontact_client/connection.rb, line 62
def raise_response_errors(response)
  return if response.success?
  error_messages = response.body.respond_to?(:exception_message) &&
    response.body.errors.present? ? response.body.errors.join("\n") : ""
  case response.status
  when 404
    raise ResourceNotFound.new(error_messages, response)
  when 400...600
    raise Error.new(error_messages, response)
  end
end
request_with_exception_handling() { || ... } click to toggle source
# File lib/incontact_client/connection.rb, line 56
def request_with_exception_handling
  yield
rescue => exception
  raise ConnectionError, exception
end
retryable_options(options) click to toggle source
# File lib/incontact_client/connection.rb, line 48
def retryable_options(options)
  {}.tap do |retry_options|
    retry_options[:tries] = options.delete(:max_tries)   || MAX_TRIES
    retry_options[:sleep] = options.delete(:retry_sleep) || RETRY_SLEEP
    retry_options[:on]    = [ConnectionError]
  end
end
underscore_hash_keys(item) click to toggle source

Based on ActiveSupport's Hash#deep_transform_keys, which is only available in versions >= 4.0.2. We'll port it here to work with versions < 4.0.2 Source: github.com/rails/rails/blob/55f9b8129a50206513264824abb44088230793c2/activesupport/lib/active_support/core_ext/hash/keys.rb#L143-L154

# File lib/incontact_client/connection.rb, line 111
def underscore_hash_keys(item)
  case item
  when Hash
    item.each_with_object({}) do |(key, value), result|
      result[key.underscore] = underscore_hash_keys(value)
    end
  when Array
    item.map { |value| underscore_hash_keys(value) }
  else
    item
  end
end