Class: PackAPI::Pagination::PaginatorBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/pack_api/pagination/paginator_builder.rb

Constant Summary collapse

DEFAULT_SORT =
'id asc'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePaginatorBuilder

Returns a new instance of PaginatorBuilder.



38
39
40
# File 'lib/pack_api/pagination/paginator_builder.rb', line 38

def initialize
  @paginator = Paginator.new
end

Instance Attribute Details

#paginatorObject

Returns the value of attribute paginator.



30
31
32
# File 'lib/pack_api/pagination/paginator_builder.rb', line 30

def paginator
  @paginator
end

Class Method Details

.build {|builder| ... } ⇒ Object

Yields:

  • (builder)


32
33
34
35
36
# File 'lib/pack_api/pagination/paginator_builder.rb', line 32

def self.build
  builder = new
  yield(builder)
  builder.paginator
end

Instance Method Details

#set_cursor(cursor:, per_page: nil, sort: nil) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/pack_api/pagination/paginator_builder.rb', line 42

def set_cursor(cursor:, per_page: nil, sort: nil)
  cursor_params = PaginatorCursor.parse(cursor)
  effective_per_page = per_page.presence || cursor_params[:per_page]
  effective_per_page = :all if effective_per_page.to_s == 'all'

  @paginator.query = cursor_params[:query]
  @paginator.total_items = cursor_params[:total_items]
  @paginator.per_page = effective_per_page
  @paginator.sort = sort.presence || cursor_params[:sort]
  @paginator.offset = effective_offset(cursor_params, sort)
  @paginator. = cursor_params[:metadata]
end

#set_params(query: nil, sort: nil, total_items: nil, per_page: nil, offset: nil, metadata: nil) ⇒ Object

Parameters:

  • query (Proc<Hash>|Hash) (defaults to: nil)

    The query parameters used to define the recordset.

  • sort (String|Symbol|Hash|Arel) (defaults to: nil)

    The ordering used to define the recordset

  • per_page (Integer|:all) (defaults to: nil)

    The count of items to include on each result page, or :all for single page results

  • offset (Integer|nil) (defaults to: nil)

    The starting index of the next result page

  • total_items (Integer|nil) (defaults to: nil)

    The count of items in the result set, if known.

  • metadata (Any|nil) (defaults to: nil)

    Any extra data structure to be passed along with the cursor



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/pack_api/pagination/paginator_builder.rb', line 62

def set_params(query: nil, sort: nil, total_items: nil, per_page: nil, offset: nil, metadata: nil)
  @paginator.query ||= {}
  if query.present?
    original_query = @paginator.query
    @paginator.query = @paginator.query.deep_merge(resolve_query_params(query).deep_symbolize_keys)
    @recordset_changed = original_query.to_json != @paginator.query.to_json
  end

  @paginator.sort ||= DEFAULT_SORT
  if sort.present?
    @recordset_changed = sort.to_json != @paginator.sort.to_json
    @paginator.sort = sort.presence
  end

  @paginator.total_items ||= 0
  if total_items.present?
    @paginator.total_items = total_items
  end

  @paginator.offset ||= 0
  if offset.present?
    @paginator.offset = offset
  elsif @recordset_changed
    @paginator.offset = 0
  end

  @paginator.per_page ||= Paginator::DEFAULT_PER_PAGE
  if per_page.present?
    @paginator.per_page = per_page
    @paginator.offset = 0 if per_page == :all
  end

  @paginator. ||= 
end