class LittleMonster::Core::API

Public Class Methods

delete(path, params = {}, options = {}) click to toggle source
# File lib/little_monster/core/api.rb, line 26
def delete(path, params = {}, options = {})
  request :delete, path, params, options
end
get(path, params = {}, options = {}) click to toggle source
# File lib/little_monster/core/api.rb, line 10
def get(path, params = {}, options = {})
  request :get, path, params, options
end
patch(path, params = {}, options = {}) click to toggle source
# File lib/little_monster/core/api.rb, line 22
def patch(path, params = {}, options = {})
  request :patch, path, params, options
end
post(path, params = {}, options = {}) click to toggle source
# File lib/little_monster/core/api.rb, line 14
def post(path, params = {}, options = {})
  request :post, path, params, options
end
put(path, params = {}, options = {}) click to toggle source
# File lib/little_monster/core/api.rb, line 18
def put(path, params = {}, options = {})
  request :put, path, params, options
end
request(method, path, params = {}, retries: LittleMonster.default_request_retries, retry_wait: LittleMonster.default_request_retry_wait, critical: false) click to toggle source
# File lib/little_monster/core/api.rb, line 30
def request(method, path, params = {}, retries: LittleMonster.default_request_retries,
            retry_wait: LittleMonster.default_request_retry_wait,
            critical: false)

  request_id = SecureRandom.uuid
  ret = 0
  res = nil
  url = [LittleMonster.api_url.chomp('/'), path.sub(/\//, '')].join '/'

  params[:body] = MultiJson.dump params.fetch(:body, {}) unless params[:body].is_a? String

  params[:headers] ||= {}
  params[:headers]['Content-Type'] = 'application/json' unless params[:headers]['Content-Type']
  params[:headers]['X-Request-ID'] = request_id

  params[:timeout] = LittleMonster.request_timeout

  begin
    res = Typhoeus.public_send method, url, params
    if res.code >= 500 || res.code.zero?
      raise FuryHttpApiError, "[type:request_failed][request_id:#{request_id}] request to #{res.effective_url} failed with status #{res.code} retry #{ret}"
    end

    logger.info "[type:request_log][request_id:#{request_id}] request made to #{url} with [status:#{res.code}]"
  rescue StandardError => e
    logger.error e.message
    if ret < retries
      sleep(retry_wait)
      ret += 1
      retry
    end

    logger.error "[type:request_max_retries_reached][request_id:#{request_id}][url:#{url}][retries:#{ret}] request has reached max retries"

    if critical
      logger.error "[type:critical_request_failed][request_id:#{request_id}][url:#{url}][retries:#{ret}] request has reached max retries"
      raise APIUnreachableError, "[request_id:#{request_id}] critical request to #{url} has fail, check little monster api"
    end
  end

  res.define_singleton_method(:body) do
    begin
      MultiJson.load(res.options[:response_body], symbolize_keys: true)
    rescue
      res.options[:response_body]
    end
  end
  res
end