Module: JSONAPI::Utils::Support::Pagination

Included in:
Response::Support
Defined in:
lib/jsonapi/utils/support/pagination.rb

Instance Method Summary collapse

Instance Method Details

#apply_pagination(records, options = {}) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
# File 'lib/jsonapi/utils/support/pagination.rb', line 5

def apply_pagination(records, options = {})
  return records unless apply_pagination?(options)
  pagination = set_pagination(options)

  records =
    if records.is_a?(Array)
      records[pagination[:range]]
    else
      pagination[:paginator].apply(records, nil)
    end
end

#apply_pagination?(options) ⇒ Boolean

Returns:

  • (Boolean)


17
18
19
20
# File 'lib/jsonapi/utils/support/pagination.rb', line 17

def apply_pagination?(options)
  JSONAPI.configuration.default_paginator != :none &&
    (options[:paginate].nil? || options[:paginate])
end

#count_records(records, options) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/jsonapi/utils/support/pagination.rb', line 62

def count_records(records, options)
  if options[:count].present?
    options[:count]
  elsif records.is_a?(Array)
    records.length
  else
    records = apply_filter(records, options) if params[:filter].present?
    records.except(:group, :order).count("DISTINCT #{records.table.name}.id")
  end
end

#pagination_params(records, options) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/jsonapi/utils/support/pagination.rb', line 22

def pagination_params(records, options)
  @paginator ||= paginator(params)
  if @paginator && JSONAPI.configuration.top_level_links_include_pagination
    options = {}
    @paginator.class.requires_record_count &&
      options[:record_count] = count_records(records, options)
    @paginator.links_page_params(options)
  else
    {}
  end
end

#paginator(params) ⇒ Object



34
35
36
37
38
39
40
41
42
43
# File 'lib/jsonapi/utils/support/pagination.rb', line 34

def paginator(params)
  page_params = ActionController::Parameters.new(params[:page])

  @paginator ||=
    if JSONAPI.configuration.default_paginator == :paged
      PagedPaginator.new(page_params)
    elsif JSONAPI.configuration.default_paginator == :offset
      OffsetPaginator.new(page_params)
    end
end

#set_pagination(options) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/jsonapi/utils/support/pagination.rb', line 45

def set_pagination(options)
  page_params = ActionController::Parameters.new(@request.params[:page])
  if JSONAPI.configuration.default_paginator == :paged
    @_paginator ||= PagedPaginator.new(page_params)
    number = page_params['number'].to_i.nonzero? || 1
    size   = page_params['size'].to_i.nonzero?   || JSONAPI.configuration.default_page_size
    { paginator: @_paginator, range: (number - 1) * size..number * size - 1 }
  elsif JSONAPI.configuration.default_paginator == :offset
    @_paginator ||= OffsetPaginator.new(page_params)
    offset = page_params['offset'].to_i.nonzero? || 0
    limit  = page_params['limit'].to_i.nonzero?  || JSONAPI.configuration.default_page_size
    { paginator: @_paginator, range: offset..offset + limit - 1 }
  else
    {}
  end
end