module Superbot::Cloud::Api

Constants

BASE_URI
ENDPOINT_MAP

Public Class Methods

request(type, params: {}) click to toggle source
# File lib/superbot/cloud/api.rb, line 36
def self.request(type, params: {})
  method, endpoint, required_param = ENDPOINT_MAP[type].values
  uri = URI.parse([BASE_URI, endpoint, params[required_param] && CGI.escape(params[required_param])].compact.join('/'))

  request_class = Net::HTTP.const_get(method.to_s.split('_').map(&:capitalize).join('::'))

  params = params.compact
  req =
    case method
    when :get
      uri.query = URI.encode_www_form(params)
      req = request_class.new(uri)
    when :post_multipart
      request_class.new(uri, params)
    else
      request_class.new(uri).tap { |r| r.set_form_data(params) }
    end

  auth_token = ENV['SUPERBOT_TOKEN'] || Superbot::Cloud.credentials&.slice(:username, :token)&.values&.join(':')
  if auth_token
    auth_type = ENV['SUPERBOT_TOKEN'] ? 'Bearer' : 'Basic'
    req['Authorization'] = "#{auth_type} #{Base64.urlsafe_encode64(auth_token)}"
  end

  response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https', read_timeout: 300, max_retries: 4) do |http|
    http.request(req)
  end
  parsed_response = response.class.body_permitted? && JSON.parse(response.body, symbolize_names: true) || {}
  return parsed_response if response.is_a? Net::HTTPSuccess

  abort parsed_response[:error]
end