class Galactus::Client

Attributes

api_version[RW]
private_api_key[R]
public_api_key[R]
router[RW]

Public Class Methods

new(settings) click to toggle source
# File lib/galactus/client.rb, line 17
def initialize(settings)
  validate_client(settings)
  @public_api_key = settings[:public_api_key]
  @private_api_key = settings[:private_api_key]
  @api_version = settings[:api_version] || 'v1'
  @router = settings[:router] || Galactus.router(api_version: api_version)
  provide_endpoint_methods
end

Private Instance Methods

api_request_hash() click to toggle source
# File lib/galactus/client.rb, line 117
def api_request_hash
  Digest::MD5.hexdigest("#{timestamp}#{private_api_key}#{public_api_key}")
end
fetch_resource_id(name, id) click to toggle source
# File lib/galactus/client.rb, line 73
def fetch_resource_id(name, id)
  endpoint = name.split('_')[0] + 's'
  resource = find_by_name_or_title(endpoint.to_sym, :name, id)
  return false unless resource
  resource[:id]
end
fetch_response(name, params = {}, headers = {}) click to toggle source
# File lib/galactus/client.rb, line 65
def fetch_response(name, params = {}, headers = {})
  id = params[:id]
  options = params[:options]
  path = find_path(name, id)

  self.class.get(path, query: marvel_api_params(options), headers: headers)
end
find_by_name_or_title(endpoint, column, value) click to toggle source
# File lib/galactus/client.rb, line 88
def find_by_name_or_title(endpoint, column, value)
  response = send(endpoint, column.to_sym => value)
  return false unless response[:data][:count] > 0
  response[:id] = response[:data][:results][0][:id]
  response
end
find_path(name, id) click to toggle source
# File lib/galactus/client.rb, line 95
def find_path(name, id)
  if id.nil?
    router.send("#{name}_path".to_sym)
  else
    id = fetch_resource_id(name, id) if id.is_a?(String)
    router.send("#{name}_path".to_sym, id: id)
  end
end
marvel_api_params(params = {}) click to toggle source
# File lib/galactus/client.rb, line 104
def marvel_api_params(params = {})
  base_hash = {
    apikey: public_api_key,
    ts: timestamp,
    hash: api_request_hash }

  params.merge(base_hash)
end
process_parameters(*args) click to toggle source
# File lib/galactus/client.rb, line 47
def process_parameters(*args)
  id_holder, options_holder = *args

  if id_holder && id_holder.is_a?(Hash)
    id = nil
    options = id_holder || {}
  elsif id_holder
    id = id_holder
    options = options_holder || {}
  else
    options = {}
  end

  params, headers = pull_headers(options)

  [{ id: id, options: params }, headers]
end
provide_endpoint_methods() click to toggle source
# File lib/galactus/client.rb, line 36
def provide_endpoint_methods
  router.routes.each do |_route_path, route_info|
    name = route_info[:name]
    self.class.send(:define_method, name) do |*args|
      params, headers = process_parameters(*args)
      response = fetch_response(name, params, headers)
      Response.create(response)
    end
  end
end
pull_headers(options) click to toggle source
# File lib/galactus/client.rb, line 80
def pull_headers(options)
  headers = options.delete(:headers) || {}
  unless headers['Accept-Encoding']
    headers.merge!('Accept-Encoding' => 'gzip')
  end
  [options, headers]
end
timestamp() click to toggle source
# File lib/galactus/client.rb, line 113
def timestamp
  Time.now.to_i
end
validate_client(settings) click to toggle source
# File lib/galactus/client.rb, line 28
def validate_client(settings)
  [:public_api_key, :private_api_key].each do |param|
    unless settings[param]
      raise InvalidClientError, "A :#{param} parameter must be specified."
    end
  end
end