Class: Onsi::Paginate

Inherits:
Object
  • Object
show all
Defined in:
lib/onsi/paginate.rb

Overview

Pagination handles cursor pagination.

It handles setting up a cursor and ordering the query. The next cursor will be added to the response’s meta object.

def index

render_resource(Onsi::Paginate.perform(person.messages, 'messages', params))

end

Examples:

Controller Action

Author:

  • Maddie Schipper

Since:

  • 1.4.0

Defined Under Namespace

Classes: Result

Class Method Summary collapse

Class Method Details

.perform(query, type, params, options = {}) ⇒ Onsi::Paginate::Result

Modify the query based on the pagination options

Parameters:

  • query (#reorder, #limit, #where, #last)

    The query to modify

  • type (#to_s)

    The type of the pagination. This us used to verify the cursor

  • params (#fetch)

    The request params.

Returns:

Raises:

Since:

  • 1.4.0



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/onsi/paginate.rb', line 31

def perform(query, type, params, options = {})
  cursor_type = type.to_s
  cursor_param = options.fetch(:cursor_param, :cursor)
  max_per_page = options.fetch(:max_per_page, 100)
  per_page_param = options.fetch(:per_page_param, :per_page)
  cursor_generator = options.fetch(:cursor, lambda { |query, type| Paginate.cursor_for_query(query, type) })
  cursor_offset = options.fetch(:offset, lambda { |query, type, cursor| Paginate.cursor_offset(query, type, cursor) })
  order_by = options.fetch(:order_by, id: :asc)

  per_page = params.fetch(per_page_param, 25).to_i
  raise Onsi::Errors::PaginationError, "too many objects per page, max #{max_per_page}" if per_page > max_per_page

  query = query.reorder(order_by)
  query = query.limit(per_page)
  query = cursor_offset.call(query, cursor_type, params.fetch(cursor_param)) if params.fetch(cursor_param, nil).present?

  response_params = {}.tap do |rp|
    rp[per_page_param] = per_page
    value = cursor_generator.call(query, cursor_type)
    rp[cursor_param] = value unless value.nil?
  end

  Result.new(query, response_params)
end