class Gibbon::APIRequest

Public Class Methods

new(builder: nil) click to toggle source
# File lib/gibbon/api_request.rb, line 5
def initialize(builder: nil)
  @request_builder = builder
end

Public Instance Methods

delete(params: nil, headers: nil) click to toggle source
# File lib/gibbon/api_request.rb, line 61
def delete(params: nil, headers: nil)
  validate_api_key

  begin
    response = self.rest_client.delete do |request|
      configure_request(request: request, params: params, headers: headers)
    end
    parse_response(response)
  rescue => e
    handle_error(e)
  end
end
get(params: nil, headers: nil) click to toggle source
# File lib/gibbon/api_request.rb, line 48
def get(params: nil, headers: nil)
  validate_api_key

  begin
    response = self.rest_client.get do |request|
      configure_request(request: request, params: params, headers: headers)
    end
    parse_response(response)
  rescue => e
    handle_error(e)
  end
end
patch(params: nil, headers: nil, body: nil) click to toggle source
# File lib/gibbon/api_request.rb, line 22
def patch(params: nil, headers: nil, body: nil)
  validate_api_key

  begin
    response = self.rest_client.patch do |request|
      configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
    end
    parse_response(response)
  rescue => e
    handle_error(e)
  end
end
post(params: nil, headers: nil, body: nil) click to toggle source
# File lib/gibbon/api_request.rb, line 9
def post(params: nil, headers: nil, body: nil)
  validate_api_key

  begin
    response = self.rest_client.post do |request|
      configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
    end
    parse_response(response)
  rescue => e
    handle_error(e)
  end
end
put(params: nil, headers: nil, body: nil) click to toggle source
# File lib/gibbon/api_request.rb, line 35
def put(params: nil, headers: nil, body: nil)
  validate_api_key

  begin
    response = self.rest_client.put do |request|
      configure_request(request: request, params: params, headers: headers, body: MultiJson.dump(body))
    end
    parse_response(response)
  rescue => e
    handle_error(e)
  end
end

Protected Instance Methods

adapter() click to toggle source
# File lib/gibbon/api_request.rb, line 98
def adapter
  @request_builder.faraday_adapter
end
api_endpoint() click to toggle source
# File lib/gibbon/api_request.rb, line 82
def api_endpoint
  @request_builder.api_endpoint
end
api_key() click to toggle source

Convenience accessors

# File lib/gibbon/api_request.rb, line 78
def api_key
  @request_builder.api_key
end
api_url() click to toggle source
# File lib/gibbon/api_request.rb, line 186
def api_url
  base_api_url + @request_builder.path
end
base_api_url() click to toggle source
# File lib/gibbon/api_request.rb, line 190
def base_api_url
  computed_api_endpoint = "https://#{get_data_center_from_api_key(self.api_key)}api.mailchimp.com"
  "#{self.api_endpoint || computed_api_endpoint}/3.0/"
end
configure_request(request: nil, params: nil, headers: nil, body: nil) click to toggle source
# File lib/gibbon/api_request.rb, line 137
def configure_request(request: nil, params: nil, headers: nil, body: nil)
  if request
    request.params.merge!(params) if params
    request.headers['Content-Type'] = 'application/json'
    request.headers.merge!(headers) if headers
    request.body = body if body
    request.options.timeout = self.timeout
    request.options.open_timeout = self.open_timeout
  end
end
handle_error(error) click to toggle source

Helpers

# File lib/gibbon/api_request.rb, line 108
def handle_error(error)
  error_params = {}

  begin
    if (error.is_a?(Faraday::ClientError) || error.is_a?(Faraday::ServerError)) && error.response
      error_params[:status_code] = error.response[:status]
      error_params[:raw_body] = error.response[:body]

      parsed_response = MultiJson.load(error.response[:body], symbolize_keys: symbolize_keys)

      if parsed_response
        error_params[:body] = parsed_response

        title_key = symbolize_keys ? :title : "title"
        detail_key = symbolize_keys ? :detail : "detail"

        error_params[:title] = parsed_response[title_key] if parsed_response[title_key]
        error_params[:detail] = parsed_response[detail_key] if parsed_response[detail_key]
      end

    end
  rescue MultiJson::ParseError
  end

  error_to_raise = MailChimpError.new(error.message, error_params)

  raise error_to_raise
end
open_timeout() click to toggle source
# File lib/gibbon/api_request.rb, line 90
def open_timeout
  @request_builder.open_timeout
end
parse_response(response) click to toggle source
# File lib/gibbon/api_request.rb, line 161
def parse_response(response)
  parsed_response = nil

  if response.body && !response.body.empty?
    begin
      headers = response.headers
      body = MultiJson.load(response.body, symbolize_keys: symbolize_keys)
      parsed_response = Response.new(headers: headers, body: body)
    rescue MultiJson::ParseError
      error_params = { title: "UNPARSEABLE_RESPONSE", status_code: 500 }
      error = MailChimpError.new("Unparseable response: #{response.body}", error_params)
      raise error
    end
  end

  parsed_response
end
proxy() click to toggle source
# File lib/gibbon/api_request.rb, line 94
def proxy
  @request_builder.proxy
end
rest_client() click to toggle source
# File lib/gibbon/api_request.rb, line 148
def rest_client
  client = Faraday.new(self.api_url, proxy: self.proxy, ssl: { version: "TLSv1_2" }) do |faraday|
    faraday.response :raise_error
    faraday.adapter adapter
    if @request_builder.debug
      faraday.response :logger, @request_builder.logger, bodies: true
    end
    faraday.request :basic_auth, 'apikey', self.api_key
  end
  
  client
end
symbolize_keys() click to toggle source
# File lib/gibbon/api_request.rb, line 102
def symbolize_keys
  @request_builder.symbolize_keys
end
timeout() click to toggle source
# File lib/gibbon/api_request.rb, line 86
def timeout
  @request_builder.timeout
end
validate_api_key() click to toggle source
# File lib/gibbon/api_request.rb, line 179
def validate_api_key
  api_key = self.api_key
  unless api_key && (api_key["-"] || self.api_endpoint)
    raise Gibbon::GibbonError, "You must set an api_key prior to making a call"
  end
end