module Ahub::APIResource

Attributes

attributes[R]

Public Class Methods

new(attrs) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 11
def initialize(attrs)
  @attributes ||= {}
  attrs.each_pair { |k,v| @attributes[k.to_sym] = v }

  attrs.each_pair do |k,v|
    attribute_name = k.to_s.underscore

    if instance_variable_get("@#{attribute_name}").nil?
      instance_variable_set("@#{attribute_name}", v)
    end

    next if respond_to?(k) && k != :id

    self.class.send(:define_method, attribute_name) do
      instance_variable_get("@#{__method__}")
    end
  end
end

Public Instance Methods

admin_headers() click to toggle source
# File lib/ahub/modules/api_resource.rb, line 56
def admin_headers
  headers(username: Ahub::ADMIN_USER, password: Ahub::ADMIN_PASS)
end
base_url() click to toggle source
# File lib/ahub/modules/api_resource.rb, line 78
def base_url
  class_name = name.gsub(/Ahub::/, '').downcase
  "#{Ahub::DOMAIN}/services/v2/#{class_name}"
end
create_resource(url:, payload:, headers:) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 112
def create_resource(url:, payload:, headers:)
  response = RestClient.post(url, payload.to_json, headers)
  find(object_id_from_response(response))
end
find(id) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 60
def find(id)
  url = "#{base_url}/#{id}.json"

  new get_resource(url: url, headers:admin_headers)
rescue RestClient::ResourceNotFound
  nil
end
find_all(params: nil, page: 1, page_size: 50) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 68
def find_all(params: nil, page: 1, page_size: 50)
  url = "#{base_url}.json?page=#{page}&pageSize=#{page_size}"

  if params
    params.each{|k,v| url << "&#{k}=#{URI.encode(v)}"}
  end

  get_resources(url: url, headers: admin_headers, klass: self)
end
get_resource(url:, headers:) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 87
def get_resource(url:, headers:)
  JSON.parse(RestClient.get(url, headers), symbolize_names:true)
end
get_resources(url:, headers:, klass:) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 91
def get_resources(url:, headers:, klass:)
  response = JSON.parse(RestClient.get(url, headers), symbolize_names:true)
  response[:list].map do |node|
    klass.new(node)
  end
end
headers(username:, password:) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 46
def headers(username:, password:)
  encoded = "Basic #{::Base64.strict_encode64("#{username}:#{password}")}"

  {
    'Authorization' => encoded,
    'Accept' => "application/json",
    'Content-type' => "application/json",
  }
end
json_url() click to toggle source
# File lib/ahub/modules/api_resource.rb, line 30
def json_url
  "#{self.class.base_url}/#{id}.json" if id
end
object_id_from_response(response) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 83
def object_id_from_response(response)
  response.headers[:location].match(/(?<id>\d*)\.json/)[:id].to_i
end
update() click to toggle source
# File lib/ahub/modules/api_resource.rb, line 34
def update
  raise NotImplementedError
end
update_attribute(attribute, value) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 38
def update_attribute(attribute, value)
  payload = {}
  payload[attribute] = value

  self.class.update_resource(resource: self, payload: payload)
end
update_resource(resource:, payload:) click to toggle source
# File lib/ahub/modules/api_resource.rb, line 98
def update_resource(resource:, payload:)
  raise Exception.new('#id is required for an update') unless resource.id
  begin
    response = RestClient.put(resource.json_url, payload.to_json, admin_headers)
    resource.send(:initialize, JSON.parse(response))
    payload.each{|k,v| resource.instance_variable_set("@#{k}", v) }
    true
  rescue Exception => e
    false
  end
end