class Unleashed::Client

Client for the Unleashed API

@see apidocs.unleashedsoftware.com

Public Class Methods

new(options = {}) click to toggle source
# File lib/unleashed/client.rb, line 35
def initialize(options = {})
  # Use options passed in, but fall back to module defaults
  Unleashed::Configurable.keys.each do |key|
    instance_variable_set(
      :"@#{key}", options[key] || Unleashed.instance_variable_get(:"@#{key}")
    )
  end
end
resources() click to toggle source

Available resources for {Client}

@return [Hash]

# File lib/unleashed/client.rb, line 141
def self.resources
  {
    customers: CustomerResource,
    invoices: InvoiceResource,
    currencies: CurrencyResource,
    payment_terms: PaymentTermResource,
    companies: CompanyResource
  }
end

Public Instance Methods

connection() click to toggle source

Create a new Faraday connection

@return [Faraday::Connection]

# File lib/unleashed/client.rb, line 47
def connection
  Faraday.new(url: @api_endpoint, request: { params_encoder: CustomParamsEncoder }) do |faraday|
    faraday.adapter :net_http
  end
end
get(url, parameters = {}, headers = {}, skip_status_check = false) click to toggle source

Make a HTTP GET request

@param url [String] The path, relative to {api_endpoint} @param parameters [Hash] Query params for request @return [Faraday::Response]

# File lib/unleashed/client.rb, line 83
def get(url, parameters = {}, headers = {}, skip_status_check = false)
  response = connection.get do |request|
    request.url "#{api_endpoint}#{url}"
    request.params = parameters.sort.to_h

    # Set headers
    request = init_default_headers(request)

    # Assign more custom headers
    headers.each do |key, value|
      request.headers[key] = value
    end

    # Print log
    time = Time.zone.now.strftime('%Y-%m-%d %H:%M:%S %z')
    puts "[#{time}] Client -- : HEADERS #{request.headers}"
    puts "[#{time}] Client -- : GET #{request.path}"
    puts "[#{time}] Client -- : PARAMS #{request.params}"
  end

  on_complete(response) unless skip_status_check
  response
end
hmac_input(params_hash) click to toggle source
# File lib/unleashed/client.rb, line 53
def hmac_input(params_hash)
  hmac_input_a = []

  params_hash.each do |k, v|
    hmac_input_a << "#{k}=#{v}"
  end

  hmac_input_a.join('&')
end
init_default_headers(request) click to toggle source
# File lib/unleashed/client.rb, line 69
def init_default_headers(request)
  request.headers['client-type'] = @client_type_header
  request.headers['Accept'] = 'application/json'
  request.headers['Content-Type'] = 'application/json'
  request.headers['api-auth-id'] = @api_id
  request.headers['api-auth-signature'] = signature(hmac_input(request.params))
  request
end
method_missing(name, *args, &block) click to toggle source

Catch calls for resources

Calls superclass method
# File lib/unleashed/client.rb, line 153
def method_missing(name, *args, &block)
  if self.class.resources.keys.include?(name)
    resources[name] ||= self.class.resources[name].new(self)
    resources[name]
  else
    super
  end
end
post(url, parameters = {}, headers = {}, skip_status_check = false) click to toggle source

Make a HTTP POST request

@param url [String] The path, relative to {#api_endpoint} @param parameters [Hash] Query params for request @return [Faraday::Response]

# File lib/unleashed/client.rb, line 112
def post(url, parameters = {}, headers = {}, skip_status_check = false)
  response = connection.post do |request|
    request.url "#{api_endpoint}#{url}"

    # Set headers
    init_default_headers(request)

    # Assign more custom headers
    headers.each do |key, value|
      request.headers[key] = value
    end

    request.body = parameters.to_json

    # Print log
    time = Time.zone.now.strftime('%Y-%m-%d %H:%M:%S %z')
    puts "[#{time}] Client -- : HEADERS #{request.headers}"
    puts "[#{time}] Client -- : POST #{request.path}"
    puts "[#{time}] Client -- : PARAMS #{request.params}"
    puts "[#{time}] Client -- : BODY #{request.body}"
  end

  on_complete(response) unless skip_status_check
  response
end
resources() click to toggle source

Resources being currently used

@return [Hash]

# File lib/unleashed/client.rb, line 165
def resources
  @resources ||= {}
end
signature(params = '') click to toggle source

Create a signature for request

# File lib/unleashed/client.rb, line 64
def signature(params = '')
  hash = OpenSSL::HMAC.digest('sha256', @api_key, params)
  Base64.strict_encode64(hash)
end

Private Instance Methods

on_complete(response) click to toggle source
# File lib/unleashed/client.rb, line 171
def on_complete(response)
  fail Unleashed::Error.from_response(response, @errors_format) unless response.success?
end