class Zendesk2::PagedCollection

adds {#create!} method to {Cistern::Collection}.

Public Class Methods

included(klass) click to toggle source
# File lib/zendesk2/paged_collection.rb, line 4
def self.included(klass)
  klass.send(:attribute, :count)
  klass.send(:attribute, :next_page_link, aliases: 'next_page')
  klass.send(:attribute, :previous_page_link, aliases: 'previous_page')
  klass.send(:extend, ClassMethods)
end

Public Instance Methods

all(params = {}) click to toggle source

Fetch a collection of resources

# File lib/zendesk2/paged_collection.rb, line 102
def all(params = {})
  if search_query?(params)
    search_page(params)
  else
    collection_page(params)
  end
  self
end
all_entries() click to toggle source

Iterate over all pages and collect every entry

@return [Array<Zendesk2::Model>] all entries in all pages

# File lib/zendesk2/paged_collection.rb, line 97
def all_entries
  each_entry.to_a
end
collection_method() click to toggle source
# File lib/zendesk2/paged_collection.rb, line 20
def collection_method
  self.class.collection_method
end
collection_root() click to toggle source
# File lib/zendesk2/paged_collection.rb, line 24
def collection_root
  self.class.collection_root
end
create(attributes = {}) click to toggle source

Quietly attempt creation of resource. Check {#new_record?} and {#errors} for success

@see {#create!} to raise an exception on failure @return [Zendesk::Model, FalseClass]

# File lib/zendesk2/paged_collection.rb, line 89
def create(attributes = {})
  model = new(attributes.merge(Zendesk2.stringify_keys(self.attributes)))
  model.save
end
create!(attributes = {}) click to toggle source

Attempt creation of resource and explode if unsuccessful

@raise [Zendesk2::Error] if creation was unsuccessful @return [Zendesk::Model]

# File lib/zendesk2/paged_collection.rb, line 80
def create!(attributes = {})
  model = new(Zendesk2.stringify_keys(attributes).merge(Zendesk2.stringify_keys(self.attributes)))
  model.save!
end
each_entry() { |r| ... } click to toggle source
# File lib/zendesk2/paged_collection.rb, line 51
def each_entry
  return to_enum(:each_entry) unless block_given?
  page = self
  while page
    page.to_a.each { |r| yield r }
    page = page.next_page
  end
end
each_page() { |page| ... } click to toggle source
# File lib/zendesk2/paged_collection.rb, line 42
def each_page
  return to_enum(:each_page) unless block_given?
  page = self
  while page
    yield page
    page = page.next_page
  end
end
get(*args) click to toggle source

Quiet version of {#get!}

@see get! @return [Zendesk2::Model] Fetched model when successful @return [NilClass] return nothing if record cannot be found

# File lib/zendesk2/paged_collection.rb, line 146
def get(*args)
  get!(*args)
rescue Zendesk2::Error
  nil
end
get!(identity_or_hash) click to toggle source

Fetch a single of resource

@overload get!(identity)

fetch a un-namespaced specific record or a namespaced record under the current {#scopes}
@param [Integer] identity identity of the record

@overload get!(scope)

directly fetch a namespaced record
@param [Hash] scope parameters to fetch record

@example Fetch a record without contextual scoping

self.identities.all("user_id" => 2, "id" => 4) # context defined directly

@example Fetch a record with contextual scoping

self.identities("user_id" => 2).get(4) # context defined in collection
user.identities.get(4)                 # context defined by encapsulating model

@raise [Zendesk2::Error] if the record cannot be found or other request error @return [Zendesk2::Model] fetched resource corresponding to value of {Zendesk2::Collection#model}

# File lib/zendesk2/paged_collection.rb, line 126
def get!(identity_or_hash)
  scoped_attributes = self.class.scopes.inject({}) { |a, e| a.merge(e.to_s => send(e)) }

  if identity_or_hash.is_a?(Hash)
    scoped_attributes.merge!(identity_or_hash)
  else
    scoped_attributes['id'] = identity_or_hash
  end

  scoped_attributes = { model_root => scoped_attributes }

  data = cistern.send(model_method, scoped_attributes).body[model_root]
  new(data) if data
end
model_method() click to toggle source
# File lib/zendesk2/paged_collection.rb, line 28
def model_method
  self.class.model_method
end
model_root() click to toggle source
# File lib/zendesk2/paged_collection.rb, line 32
def model_root
  self.class.model_root
end
new_page() click to toggle source
# File lib/zendesk2/paged_collection.rb, line 36
def new_page
  page = self.class.new(cistern: cistern)
  page.merge_attributes(self.class.scopes.inject({}) { |a, e| a.merge(e.to_s => public_send(e)) })
  page
end
next_page() click to toggle source
# File lib/zendesk2/paged_collection.rb, line 60
def next_page
  return nil unless next_page_link

  options = { 'url' => next_page_link }
  options['filtered'] = filtered if respond_to?(:filtered) # searchable
  new_page.all(options)
end
previous_page() click to toggle source
# File lib/zendesk2/paged_collection.rb, line 68
def previous_page
  return nil unless previous_page_link

  options = { 'url' => previous_page_link }
  options['filtered'] = filtered if respond_to?(:filtered) # searchable
  new_page.all(options)
end

Protected Instance Methods

collection_page(params) click to toggle source
# File lib/zendesk2/paged_collection.rb, line 164
def collection_page(params)
  scoped_attributes = self.class.scopes.inject({}) { |a, e| a.merge(e.to_s => send(e)) }.merge(params)
  body = cistern.send(collection_method, scoped_attributes).body

  load(body[collection_root]) # 'results' is the key for paged seraches
  merge_attributes(Cistern::Hash.slice(body, 'count', 'next_page', 'previous_page'))
end
search_page(params) click to toggle source
# File lib/zendesk2/paged_collection.rb, line 158
def search_page(params)
  query = Faraday::NestedParamsEncoder.decode(URI.parse(params.fetch('url')).query)

  search(query.delete('query'), query)
end
search_query?(params) click to toggle source
# File lib/zendesk2/paged_collection.rb, line 154
def search_query?(params)
  params['filtered'] && params['url']
end