class InContact::Connection
Constants
- API_PATH_PREFIX
- MAX_TRIES
- OPEN_TIMEOUT
- RETRY_SLEEP
- TIMEOUT
Attributes
default_data_model[R]
url[R]
Public Class Methods
new(url, authorization, options = {})
click to toggle source
# File lib/incontact/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/connection.rb, line 19 def get(path, params = {}) request :get, path, params end
post(path, payload = "", params = {})
click to toggle source
# File lib/incontact/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/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/connection.rb, line 74 def connection @connection ||= create_connection end
create_connection()
click to toggle source
# File lib/incontact/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/connection.rb, line 93 def data_model(item) klass = name.demodulize.underscore.singularize.classify "InContact::Responses::#{klass}Response".constantize rescue nil end
map_response_item_to_model(item, data_model_override)
click to toggle source
# File lib/incontact/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/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/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/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/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/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