class Bunq::Paginated

doc.bunq.com/api/1/page/pagination

Public Class Methods

new(resource) click to toggle source
# File lib/bunq/paginated.rb, line 9
def initialize(resource)
  @resource = resource
end

Public Instance Methods

paginate(count: 200, older_id: nil, newer_id: nil) click to toggle source
# File lib/bunq/paginated.rb, line 13
def paginate(count: 200, older_id: nil, newer_id: nil)
  params = setup_params(count, older_id, newer_id)
  enumerator(params)
end

Private Instance Methods

enumerator(params) click to toggle source
# File lib/bunq/paginated.rb, line 29
def enumerator(params)
  last_page = false
  next_params = params

  Enumerator.new do |yielder|
    loop do
      fail StopIteration if last_page

      result = @resource.with_session { @resource.get(next_params) }
      result['Response'].each do |item|
        yielder << item
      end

      pagination = result['Pagination']
      fail MissingPaginationObject unless pagination

      last_page = !pagination[paging_url(params)]
      next if last_page

      next_params = params.merge(
        "#{paging_id(params)}": param(
          paging_id(params),
          pagination[paging_url(params)],
        ),
      )
    end
  end
end
paging_id(params) click to toggle source
# File lib/bunq/paginated.rb, line 64
def paging_id(params)
  return 'newer_id' if params[:newer_id]

  'older_id'
end
paging_url(params) click to toggle source
# File lib/bunq/paginated.rb, line 58
def paging_url(params)
  return 'newer_url' if params[:newer_id]

  'older_url'
end
param(name, url) click to toggle source
# File lib/bunq/paginated.rb, line 70
def param(name, url)
  CGI.parse(URI(url).query)[name]&.first
end
setup_params(count, older_id, newer_id) click to toggle source
# File lib/bunq/paginated.rb, line 20
def setup_params(count, older_id, newer_id)
  fail ArgumentError, 'Cant pass both older_id and newer_id' if older_id && newer_id

  params = {count: count}
  params[:older_id] = older_id if older_id
  params[:newer_id] = newer_id if newer_id
  params
end