lib/vzaar_api/lib/paged_resource.rb
module VzaarApi
module Lib
class PagedResource
attr_reader :query, :meta, :collection, :resource_class, :resource_url,
:scope_id
def initialize(query = {})
@query = query.dup
@resource_class = @query.delete(:resource_class)
@resource_url = @query.delete(:resource_url)
@scope_id = @query.delete(:scope_id)
@loaded = false
end
def loaded?
@loaded
end
def each_item
return enum_for :each_item unless block_given?
begin
each { |record| yield record }
end while !self.next.empty?
end
def first
loaded? ? load_page_url(:first) : load!
end
def next
load_page_url :next
end
def previous
load_page_url :previous
end
def last
load_page_url :last
end
private
def load!
@loaded = true
load_from_url resource_url, query
end
def load_page_url(page)
load! unless loaded?
if url = meta_link(page)
load_from_url meta[:links][page]
else
[]
end
end
def meta_link(page)
return unless meta
meta[:links][page]
end
def each
return enum_for :each unless block_given?
load! unless collection
collection.each { |record| yield record }
end
def load_from_url(url, query = {})
response = Api.new.get(url, query)
@meta = response.meta
@collection = build_collection response.data
end
def build_collection(items)
items.map do |attrs|
attrs = scope_id ? attrs.merge(scope_id: scope_id) : attrs
resource_class.new attrs
end
end
end
end
end