class Sisense::API::Client

Constants

PATH_SEGMENT_PATTERN
VERB_MAP

Attributes

http[R]

Public Class Methods

new() click to toggle source
# File lib/sisense/api/client.rb, line 22
def initialize
  uri = URI.parse(base_uri)
  @http = Net::HTTP.new(uri.host, uri.port)
  @http.use_ssl = Sisense.use_ssl
end

Public Instance Methods

delete(path) click to toggle source
# File lib/sisense/api/client.rb, line 46
def delete(path)
  request :delete, path
end
get(path, params: {}) click to toggle source
# File lib/sisense/api/client.rb, line 30
def get(path, params: {})
  request :get, path, params
end
parsed_response(response, object_class:) click to toggle source
# File lib/sisense/api/client.rb, line 50
def parsed_response(response, object_class:)
  response_hash = JSON.parse(response.body)
  if collection?(response_hash)
    response_hash
      .select { |obj| obj.is_a?(Hash) }
      .map { |json_item| object_class.new(json_item) }
  else
    object_class.new(response_hash)
  end
end
patch(path, params: {}) click to toggle source
# File lib/sisense/api/client.rb, line 42
def patch(path, params: {})
  request :patch, path, params
end
post(path, params: {}) click to toggle source
# File lib/sisense/api/client.rb, line 34
def post(path, params: {})
  request :post, path, params
end
put(path, params: {}) click to toggle source
# File lib/sisense/api/client.rb, line 38
def put(path, params: {})
  request :put, path, params
end

Private Instance Methods

base_uri() click to toggle source
# File lib/sisense/api/client.rb, line 63
def base_uri
  @base_uri ||= Sisense.use_ssl ? "https://#{Sisense.hostname}" : "http://#{Sisense.hostname}"
end
collection?(response_body) click to toggle source
# File lib/sisense/api/client.rb, line 67
def collection?(response_body)
  response_body.is_a?(Array)
end
encode_path(path, params = nil) click to toggle source
# File lib/sisense/api/client.rb, line 108
def encode_path(path, params = nil)
  encoded_path = encode_path_segments(path)
  return encoded_path if params.nil?

  encoded_params = URI.encode_www_form(params)
  uri = URI::HTTP.build(path: encoded_path, query: encoded_params)
  uri.request_uri
end
encode_path_segments(path) click to toggle source
# File lib/sisense/api/client.rb, line 102
def encode_path_segments(path)
  path.gsub PATH_SEGMENT_PATTERN do |segment|
    url_encode(segment)
  end
end
handle_error(response) click to toggle source
# File lib/sisense/api/client.rb, line 88
def handle_error(response)
  error_params = JSON.parse(response.body, symbolize_names: true)
  new_api_format_error_params = error_params[:error]
  error_params = new_api_format_error_params || error_params
  case response.code
  when "404"
    raise Sisense::API::NotFoundError, error_params
  when "422"
    raise Sisense::API::UnprocessableEntityError, error_params
  else
    raise Sisense::API::Error, error_params
  end
end
handle_response(response) click to toggle source
# File lib/sisense/api/client.rb, line 82
def handle_response(response)
  return response if %w[200 201 204].include?(response.code)

  handle_error(response)
end
headers() click to toggle source
# File lib/sisense/api/client.rb, line 117
def headers
  @headers ||= {"Authorization" => "Bearer #{Sisense.access_token}", "Content-Type" => "application/json"}
end
parameterize(object) click to toggle source
# File lib/sisense/api/client.rb, line 121
def parameterize(object)
  object.tap do |obj|
    return object.map { |item| parameterize(item) } if object.is_a?(Array)

    obj.keys.each do |key|
      obj[key] = parameterize_object(obj[key])
      obj[key.to_s.to_camel_case] = obj.delete(key)
    end
  end
end
parameterize_object(object) click to toggle source
# File lib/sisense/api/client.rb, line 132
def parameterize_object(object)
  return parameterize(object.to_h) if Sisense::API::Resource.descendants.include?(object.class)
  return parameterize(object) if object.is_a?(Hash)
  return object.map { |item| item.is_a?(String) ? item : parameterize_object(item) } if object.is_a?(Array)

  object
end
request(method, path, params = {}) click to toggle source
# File lib/sisense/api/client.rb, line 71
def request(method, path, params = {})
  case method
  when :get
    request = VERB_MAP[method].new(encode_path(path, params), headers)
  else
    request = VERB_MAP[method].new(encode_path(path), headers)
    request.body = parameterize(params).to_json
  end
  handle_response(http.request(request))
end