class Blurb::Request

Public Class Methods

new(url:, request_type:, payload: nil, headers:, url_params: nil) click to toggle source
# File lib/blurb/request.rb, line 11
def initialize(url:, request_type:, payload: nil, headers:, url_params: nil)
  @url = setup_url(url, url_params)
  @payload = convert_payload(payload)
  @headers = headers
  @request_type = request_type
end

Public Instance Methods

make_request() click to toggle source
# File lib/blurb/request.rb, line 38
def make_request
  begin
    resp = RestClient::Request.execute(request_config())
    log("response", resp)
  rescue RestClient::TooManyRequests => err
    raise RequestThrottled.new(JSON.parse(err.response.body))
  rescue RestClient::TemporaryRedirect => err
    return RestClient.get(err.response.headers[:location])  # If this happens, then we are downloading a report from the api, so we can simply download the location
  rescue RestClient::NotAcceptable => err
    if @url.include?("report")
      raise InvalidReportRequest.new(JSON.parse(err.response.body))
    else
      raise err
    end
  rescue RestClient::ExceptionWithResponse => err
    if err.response.present?
      raise FailedRequest.new(JSON.parse(err.response.body))
    else 
      raise err
    end
  end
  resp = convert_response(resp)
  return resp
end
request_config() click to toggle source
# File lib/blurb/request.rb, line 18
def request_config
  request_config = {
    method: @request_type,
    url: @url,
    headers: @headers
  }

  case @request_type
  when :get
    request_config[:max_redirects] = 0
  when :post, :put
    request_config[:payload] = @payload if @payload
  end
  log("request type", @request_type)
  log("request url", @url)
  log("headers", @headers)
  log("payload", @payload) if @payload
  return request_config
end

Private Instance Methods

camelcase_key(k) click to toggle source
# File lib/blurb/request.rb, line 93
def camelcase_key(k)
  return k if k.to_s == k.to_s.upcase
  k.to_s.camelize(:lower)
end
camelcase_keys(value) click to toggle source
# File lib/blurb/request.rb, line 81
def camelcase_keys(value)
  case value
    when Array
      value.map { |v| camelcase_keys(v) }
    when Hash
      Hash[value.map { |k, v| [camelcase_key(k), camelcase_keys(v)] }]
    else
      value = value.strftime('%Y%m%d') if [Date, Time, ActiveSupport::TimeWithZone].include?(value.class)
      value
   end
end
convert_payload(payload) click to toggle source
# File lib/blurb/request.rb, line 69
def convert_payload(payload)
  return if payload.nil?
  payload = camelcase_keys(payload)
  return payload.to_json
end
convert_response(resp) click to toggle source
# File lib/blurb/request.rb, line 75
def convert_response(resp)
  resp = JSON.parse(resp)
  resp = underscore_keys(resp)
  return resp
end
log(header, message) click to toggle source
# File lib/blurb/request.rb, line 113
def log(header, message)
  if ENV["BLURB_LOGGING"]
    puts "\n"
    puts header.upcase
    puts message
    puts "\n"
  end
end
setup_url(url, url_params) click to toggle source
# File lib/blurb/request.rb, line 64
def setup_url(url, url_params)
  url += "?#{URI.encode_www_form(camelcase_keys(url_params))}" if url_params
  return url
end
underscore_key(k) click to toggle source
# File lib/blurb/request.rb, line 109
def underscore_key(k)
  k.to_s.underscore.to_sym
end
underscore_keys(value) click to toggle source
# File lib/blurb/request.rb, line 98
def underscore_keys(value)
  case value
    when Array
      value.map { |v| underscore_keys(v) }
    when Hash
      Hash[value.map { |k, v| [underscore_key(k), underscore_keys(v)] }]
    else
      value
   end
end