class Myob::Api::Model::Base

Constants

API_URL
QUERY_OPTIONS

Public Class Methods

new(client, model_name) click to toggle source
# File lib/myob/api/models/base.rb, line 9
def initialize(client, model_name)
  @client          = client
  @model_name      = model_name || 'Base'
  @next_page_link  = nil
end

Public Instance Methods

all(params = nil) click to toggle source
# File lib/myob/api/models/base.rb, line 19
def all(params = nil)
  perform_request(self.url(nil, params))
end
Also aliased as: get
all_items(params = nil) click to toggle source
# File lib/myob/api/models/base.rb, line 37
def all_items(params = nil)
  results = all(params)["Items"]
  while next_page?
    results += next_page["Items"] || []
  end
  results
end
destroy(object) click to toggle source
# File lib/myob/api/models/base.rb, line 58
def destroy(object)
  @client.connection.delete(self.url(object), :headers => @client.headers)
end
find(id) click to toggle source
# File lib/myob/api/models/base.rb, line 45
def find(id)
  object = { 'UID' => id }
  perform_request(self.url(object))
end
first(params = nil) click to toggle source
# File lib/myob/api/models/base.rb, line 50
def first(params = nil)
  all(params).first
end
get(params = nil)
Alias for: all
model_route() click to toggle source
# File lib/myob/api/models/base.rb, line 15
def model_route
  @model_name.to_s
end
new_record?(object) click to toggle source
# File lib/myob/api/models/base.rb, line 81
def new_record?(object)
  object["UID"].nil? || object["UID"] == ""
end
next_page(params = nil) click to toggle source
# File lib/myob/api/models/base.rb, line 33
def next_page(params = nil)
  perform_request(@next_page_link)
end
next_page?() click to toggle source
# File lib/myob/api/models/base.rb, line 29
def next_page?
  !!@next_page_link
end
records(params = nil) click to toggle source
# File lib/myob/api/models/base.rb, line 24
def records(params = nil)
  response = all(params)
  response.is_a?(Hash) && response.key?('Items') ? response['Items'] : response
end
save(object) click to toggle source
# File lib/myob/api/models/base.rb, line 54
def save(object)
  new_record?(object) ? create(object) : update(object)
end
url(object = nil, params = nil) click to toggle source
# File lib/myob/api/models/base.rb, line 62
def url(object = nil, params = nil)
  url = if self.model_route == ''
    API_URL
  else
    if @client && @client.current_company_file_url
      "#{@client.current_company_file_url}/#{self.model_route}#{"/#{object['UID']}" if object && object['UID']}"
    else
      "#{API_URL}#{@client.current_company_file[:id]}/#{self.model_route}#{"/#{object['UID']}" if object && object['UID']}"
    end
  end

  if params.is_a?(Hash)
    query = query_string(params)
    url += "?#{query}" if !query.nil? && query.length > 0
  end

  url
end

Private Instance Methods

build_filter(value) click to toggle source
# File lib/myob/api/models/base.rb, line 137
def build_filter(value)
  return value unless value.is_a?(Hash)

  value.map { |key, value| "#{key} eq '#{value.to_s.gsub("'", %q(\\\'))}'" }.join(' and ')
end
create(object) click to toggle source
# File lib/myob/api/models/base.rb, line 86
def create(object)
  object = typecast(object)
  response = @client.connection.post(self.url, {:headers => @client.headers, :body => object.to_json})
end
date_formatter() click to toggle source
# File lib/myob/api/models/base.rb, line 108
def date_formatter
  "%Y-%m-%dT%H:%M:%S"
end
parse_response(response) click to toggle source
# File lib/myob/api/models/base.rb, line 143
def parse_response(response)
  JSON.parse(response.body)
end
perform_request(url) click to toggle source
# File lib/myob/api/models/base.rb, line 120
def perform_request(url)
  model_data = parse_response(@client.connection.get(url, {:headers => @client.headers}))
  @next_page_link = model_data['NextPageLink'] if self.model_route != ''
  model_data
end
process_query(data, query) click to toggle source
# File lib/myob/api/models/base.rb, line 147
def process_query(data, query)
  query.each do |property, value|
    data.select! {|x| x[property] == value}
  end
  data
end
query_string(params) click to toggle source
# File lib/myob/api/models/base.rb, line 126
def query_string(params)
  params.map do |key, value|
    if QUERY_OPTIONS.include?(key)
      value = build_filter(value) if key == :filter
      key = "$#{key}"
    end

    "#{key}=#{CGI.escape(value.to_s)}"
  end.join('&')
end
resource_url() click to toggle source
# File lib/myob/api/models/base.rb, line 112
def resource_url
  if @client && @client.current_company_file_url
    "#{@client.current_company_file_url}/#{self.model_route}"
  else
    "#{API_URL}#{@client.current_company_file[:id]}/#{self.model_route}"
  end
end
typecast(object) click to toggle source
# File lib/myob/api/models/base.rb, line 96
def typecast(object)
  returned_object = object.dup # don't change the original object

  returned_object.each do |key, value|
    if value.respond_to?(:strftime)
      returned_object[key] = value.strftime(date_formatter)
    end
  end

  returned_object
end
update(object) click to toggle source
# File lib/myob/api/models/base.rb, line 91
def update(object)
  object = typecast(object)
  response = @client.connection.put(self.url(object), {:headers => @client.headers, :body => object.to_json})
end