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