class Rnow::Resource
Attributes
Public Class Methods
# File lib/rnow/resource.rb, line 72 def self._return_fields (self.remote_attrs + self.remote_read_only_attrs).join(",") end
Return an array of all records for this resource. There is a limit to about 1000 records that are returned here, so if your resource has more you will need to use paging or search to retreive what you need. See self.paginate() for paganition, see self.find() for search support.
# File lib/rnow/resource.rb, line 87 def self.all(connection, params = {}) JSON.parse(connection.get(resource_uri, params).body)["items"].map do |item| href = item.delete("links").first["href"] new(item.merge({href: href, connection: connection})) end end
# File lib/rnow/resource.rb, line 76 def self.default_params {:_return_fields => self._return_fields} end
Filter resources with query by key value pair Typical query patter is: uri = “services/rest/connect/latest/contacts?q=lookupName like ‘%Soheil%’”
Example: Rnow::Contact.filter
(connection, “lookupName”, “Soheil Eizadi”)
# File lib/rnow/resource.rb, line 161 def self.filter(connection, params = {key: nil, value: nil}) key = params.delete(:key) value = params.delete(:value) JSON.parse(connection.get(resource_uri, {q: "#{key} like '%#{value}%'"}).body)["items"].map do |item| href = item.fetch("links").first["href"] new(item.merge({href: href, connection: connection})) end end
Find resources with query by key value pair Typical query patter is: uri = services/rest/connect/latest/contacts?q=lookupName=‘Soheil Eizadi’
Example: Rnow::Contact.find
(connection, “lookupName”, “Soheil Eizadi”)
# File lib/rnow/resource.rb, line 122 def self.find(connection, params = {key: nil, value: nil}) key = params.delete(:key) value = params.delete(:value) search = (value.is_a? Integer) ? value : "'#{value}'" JSON.parse(connection.get(resource_uri, {q: "#{key}=#{search}"}).body)["items"].map do |item| href = item.delete("links").first["href"] new(item.merge({href: href, connection: connection})) end end
Find resoures with ROQL using where clause
# File lib/rnow/resource.rb, line 135 def self.find_where(connection, params = {key: nil, value: nil, count: 10}) key = params.delete(:key) value = params.delete(:value) page = params.delete(:page) count = params.delete(:count) uri = Rnow.base_path + 'queryResults'; search = (value.is_a? Integer) ? value : "'#{value}'" params = {query: URI.escape("select * from #{self.rnow_object} where #{key}=#{search}")} response = JSON.parse(connection.get(uri, params).body) keys = response["items"].first["columnNames"] rows = response["items"].first["rows"] resources=[] rows.each do |row| hash = Hash[keys.zip row] resources << new(hash.merge({href: resource_uri + '/' + hash["id"], connection: connection})) end resources end
# File lib/rnow/resource.rb, line 182 def initialize(attrs={}) load_attributes(attrs) end
Return an array of paged records for this resource. The page number from 0-N can be specified The count is the number of entries returned per page
# File lib/rnow/resource.rb, line 99 def self.paginate(connection, params = {page: 0, count: 10}) page = params.delete(:page) count = params.delete(:count) uri = Rnow.base_path + 'queryResults'; params = {query: URI.escape("select * from #{self.rnow_object} limit #{count} offset #{page}")} response = JSON.parse(connection.get(uri, params).body) keys = response["items"].first["columnNames"] rows = response["items"].first["rows"] resources=[] rows.each do |row| hash = Hash[keys.zip row] resources << new(hash.merge({href: resource_uri + '/' + hash["id"], connection: connection})) end resources end
Define a writeable remote attribute, i.e. one that should show up in post / put operations.
# File lib/rnow/resource.rb, line 18 def self.remote_attr_accessor(*args) args.each do |a| attr_accessor a remote_attrs << a end end
Define a read-only attribute
# File lib/rnow/resource.rb, line 49 def self.remote_attr_reader(*args) args.each do |a| attr_reader a remote_read_only_attrs << a end end
Define a remote attribute that is write-only
# File lib/rnow/resource.rb, line 39 def self.remote_attr_writer(*args) args.each do |a| attr_accessor a remote_write_only_attrs << a end end
# File lib/rnow/resource.rb, line 56 def self.remote_attrs @remote_attrs ||= [] end
Define a remote attribute that can only be sent during a POST operation.
# File lib/rnow/resource.rb, line 29 def self.remote_post_accessor(*args) args.each do |a| attr_accessor a remote_post_attrs << a end end
# File lib/rnow/resource.rb, line 68 def self.remote_post_attrs @remote_post_attrs ||= [] end
# File lib/rnow/resource.rb, line 64 def self.remote_read_only_attrs @remote_read_only_attrs ||= [] end
# File lib/rnow/resource.rb, line 60 def self.remote_write_only_attrs @remote_write_only_attrs ||= [] end
# File lib/rnow/resource.rb, line 170 def self.resource_uri Rnow.base_path + self.rnow_object end
# File lib/rnow/resource.rb, line 5 def self.rnow_object(obj=nil) if obj.nil? @rnow_object else self.resource_map[obj] = self @rnow_object = obj end end
Public Instance Methods
# File lib/rnow/resource.rb, line 193 def delete connection.delete(resource_uri).status == 200 end
# File lib/rnow/resource.rb, line 197 def get(params=self.class.default_params) response = connection.get(resource_uri, params).body load_attributes(JSON.parse(response)) self end
# File lib/rnow/resource.rb, line 186 def post resource = JSON.parse(connection.post(resource_uri, remote_attribute_hash(write = true, post = true)).body) self.href = resource.fetch("links").first["href"] true end
# File lib/rnow/resource.rb, line 203 def put resource = JSON.parse(connection.put(resource_uri, remote_attribute_hash(write = true)).body) self.href = resource.fetch("links").first["href"] true end
# File lib/rnow/resource.rb, line 213 def remote_attribute_hash(write=false, post=false) {}.tap do |hsh| self.class.remote_attrs.each do |k| hsh[k] = self.send(k) unless self.send(k).nil? end self.class.remote_write_only_attrs.each do |k| hsh[k] = self.send(k) unless self.send(k).nil? end if write self.class.remote_post_attrs.each do |k| hsh[k] = self.send(k) unless self.send(k).nil? end if post end end
# File lib/rnow/resource.rb, line 209 def resource_uri self.href.nil? ? self.class.resource_uri : (Rnow.base_path + self.href) end
Private Instance Methods
# File lib/rnow/resource.rb, line 229 def load_attributes(attrs) attrs.each do |k,v| # Some things have specialized writers if respond_to?("#{k}=") send("#{k}=", v) # Some things don't have writers (i.e. remote_attr_reader fields) else instance_variable_set("@#{k}", v) end end end