Class: RESTFramework::Paginators::PageNumberPaginator

Inherits:
BasePaginator
  • Object
show all
Defined in:
lib/rest_framework/paginators/page_number_paginator.rb

Overview

A simple paginator based on page numbers.

Example: example.com/api/users/?page=3&page_size=50

Instance Method Summary collapse

Constructor Details

#initialize(**kwargs) ⇒ PageNumberPaginator

Returns a new instance of PageNumberPaginator.



5
6
7
8
9
10
11
12
13
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 5

def initialize(**kwargs)
  super
  # Exclude any `select` clauses since that would cause `count` to fail with a SQL `SyntaxError`.
  @count = @data.except(:select).count
  @page_size = self._page_size

  @total_pages = @count / @page_size
  @total_pages += 1 if @count % @page_size != 0
end

Instance Method Details

#_page_sizeObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 15

def _page_size
  page_size = nil

  # Get from context, if allowed.
  if @controller.page_size_query_param
    if page_size = @controller.params[@controller.page_size_query_param].presence
      page_size = page_size.to_i
    end
  end

  # Otherwise, get from config.
  if !page_size && @controller.page_size
    page_size = @controller.page_size
  end

  # Ensure we don't exceed the max page size.
  if @controller.max_page_size && page_size > @controller.max_page_size
    page_size = @controller.max_page_size
  end

  # Ensure we return at least 1.
  return page_size.zero? ? 1 : page_size
end

#get_page(page_number = nil) ⇒ Object

Get the page and return it so the caller can serialize it.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 40

def get_page(page_number=nil)
  # If page number isn't provided, infer from the params or use 1 as a fallback value.
  unless page_number
    page_number = @controller&.params&.[](@controller.page_query_param&.to_sym)
    if page_number.blank?
      page_number = 1
    else
      page_number = page_number.to_i
      if page_number.zero?
        page_number = 1
      end
    end
  end
  @page_number = page_number

  # Get the data page and return it so the caller can serialize the data in the proper format.
  page_index = @page_number - 1
  return @data.limit(@page_size).offset(page_index * @page_size)
end

#get_paginated_response(serialized_page) ⇒ Object

Wrap the serialized page with appropriate metadata. TODO: include links.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/rest_framework/paginators/page_number_paginator.rb', line 61

def get_paginated_response(serialized_page)
  page_query_param = @controller.page_query_param
  base_params = @controller.params.to_unsafe_h
  next_url = if @page_number < @total_pages
    @controller.url_for({**base_params, page_query_param => @page_number + 1})
  end
  previous_url = if @page_number > 1
    @controller.url_for({**base_params, page_query_param => @page_number - 1})
  end

  return {
    count: @count,
    page: @page_number,
    page_size: @page_size,
    total_pages: @total_pages,
    next: next_url,
    previous: previous_url,
    results: serialized_page,
  }.compact
end