class RetailcrmApi::APIRequest

Public Class Methods

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

Public Instance Methods

get(params: nil, headers: nil, first_time: true) click to toggle source
# File lib/retailcrm-api/api_request.rb, line 25
def get(params: nil, headers: nil, first_time: true)
  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
    if e.response.dig(:status) == 403 && first_time
      sleep(0.3.second)
      self.get(params: params, headers: headers, first_time: false)
    else
      handle_error(e)
    end
  end
end
post(params: nil, headers: nil, suffix: nil, body: {}, first_time: true) click to toggle source
# File lib/retailcrm-api/api_request.rb, line 8
def post(params: nil, headers: nil, suffix: nil, body: {}, first_time: true)
  validate_api_key
  begin
    response = self.rest_client(suffix).post do |request|
      configure_request(request: request, params: params, headers: headers, body: body)
    end
    parse_response(response)
  rescue => e
    if e.response.dig(:status) == 403 && first_time
      sleep(0.3.second)
      self.post(params: params, headers: headers, suffix: suffix, body: body, first_time: false)
    else
      handle_error(e)
    end
  end
end

Protected Instance Methods

adapter() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 67
def adapter
  @request_builder.faraday_adapter
end
api_endpoint() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 51
def api_endpoint
  @request_builder.api_endpoint
end
api_key() click to toggle source

Convenience accessors

# File lib/retailcrm-api/api_request.rb, line 47
def api_key
  @request_builder.api_key
end
api_url() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 158
def api_url
  base_api_url + @request_builder.path
end
base_api_url() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 162
def base_api_url
  "#{RetailcrmApi.api_endpoint}/api/v5/"
end
configure_request(request: nil, params: nil, headers: nil, body: nil) click to toggle source
# File lib/retailcrm-api/api_request.rb, line 106
def configure_request(request: nil, params: nil, headers: nil, body: nil)
  if request
    request.params.merge!(params) if params
    request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
    request.headers['X-API-KEY'] = "#{self.api_key}"
    request.headers['User-Agent'] = "RetailCrmApi/#{RetailcrmApi::VERSION} Ruby gem"
    request.headers.merge!(headers) if headers
    if body
      body.each { |k, v| body[k] = MultiJson.dump(v) if [Array, Hash].include?(v.class) }
      request.body = URI.encode_www_form(body)
    end
    request.options.timeout = self.timeout
    request.options.open_timeout = self.open_timeout
  end
end
handle_error(error) click to toggle source

Helpers

# File lib/retailcrm-api/api_request.rb, line 77
def handle_error(error)
  error_params = {}

  begin
    if error.is_a?(Faraday::ClientError) && 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 = RetailcrmError.new(error.message, error_params)

  raise error_to_raise
end
open_timeout() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 59
def open_timeout
  @request_builder.open_timeout
end
parse_response(response) click to toggle source
# File lib/retailcrm-api/api_request.rb, line 134
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 = RetailcrmError.new("Unparseable response: #{response.body}", error_params)
      raise error
    end
  end

  parsed_response
end
proxy() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 63
def proxy
  @request_builder.proxy
end
rest_client(suffix=nil) click to toggle source
# File lib/retailcrm-api/api_request.rb, line 122
def rest_client(suffix=nil)
  client = Faraday.new("#{self.api_url}#{suffix.present? ? "/#{suffix}": ""}", 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
  end
  client
end
symbolize_keys() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 71
def symbolize_keys
  @request_builder.symbolize_keys
end
timeout() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 55
def timeout
  @request_builder.timeout
end
validate_api_key() click to toggle source
# File lib/retailcrm-api/api_request.rb, line 152
def validate_api_key
  unless self.api_key && self.api_endpoint
    raise RetailcrmApi::RetailcrmApiError, "You must set an api_key prior to making a call #{self.api_key} #{self.api_endpoint}"
  end
end