Skip to content

Commit 80e136e

Browse files
committed
feat(pagination): return meta page_count for paged paginators
1 parent 9e666d9 commit 80e136e

3 files changed

Lines changed: 29 additions & 1 deletion

File tree

lib/jsonapi/operation.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ def apply
5757
options[:record_count] = record_count
5858
end
5959

60+
if JSONAPI.configuration.top_level_meta_include_page_count
61+
options[:page_count] = page_count
62+
end
63+
6064
return JSONAPI::ResourcesOperationResult.new(:ok,
6165
resource_records,
6266
options)
@@ -153,6 +157,12 @@ def record_count
153157
@_record_count ||= records.count(:all)
154158
end
155159

160+
def page_count
161+
if @paginator.is_a?(PagedPaginator)
162+
@_page_count ||= @paginator.calculate_page_count(record_count)
163+
end
164+
end
165+
156166
def source_resource
157167
@_source_resource ||= @source_klass.find_by_key(@source_id, context: @context)
158168
end
@@ -176,6 +186,7 @@ def options
176186
opts = {}
177187
opts.merge!(pagination_params: pagination_params) if JSONAPI.configuration.top_level_links_include_pagination
178188
opts.merge!(record_count: record_count) if JSONAPI.configuration.top_level_meta_include_record_count
189+
opts.merge!(page_count: page_count) if JSONAPI.configuration.top_level_meta_include_page_count
179190
opts
180191
end
181192

lib/jsonapi/operation_result.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,13 @@ def initialize(code, resource, options = {})
3232
end
3333

3434
class ResourcesOperationResult < OperationResult
35-
attr_accessor :resources, :pagination_params, :record_count
35+
attr_accessor :resources, :pagination_params, :record_count, :page_count
3636

3737
def initialize(code, resources, options = {})
3838
@resources = resources
3939
@pagination_params = options.fetch(:pagination_params, {})
4040
@record_count = options[:record_count]
41+
@page_count = options[:page_count]
4142
super(code, options)
4243
end
4344
end

test/integration/requests/request_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,22 @@ def test_filter_related_resources
442442
JSONAPI.configuration.top_level_meta_include_record_count = false
443443
end
444444

445+
def test_page_count_meta
446+
Api::V2::BookCommentResource.paginator :paged
447+
JSONAPI.configuration.top_level_meta_include_record_count = true
448+
JSONAPI.configuration.top_level_meta_include_page_count = true
449+
get '/api/v2/books/1/book_comments'
450+
assert_equal 26, json_response['meta']['record_count']
451+
# based on default page size
452+
assert_equal 3, json_response['meta']['page_count']
453+
get '/api/v2/books/1/book_comments?page[size]=5'
454+
assert_equal 26, json_response['meta']['record_count']
455+
assert_equal 6, json_response['meta']['page_count']
456+
ensure
457+
JSONAPI.configuration.top_level_meta_include_record_count = false
458+
JSONAPI.configuration.top_level_meta_include_page_count = false
459+
end
460+
445461
def test_pagination_related_resources_without_related
446462
Api::V2::BookResource.paginator :offset
447463
Api::V2::BookCommentResource.paginator :offset

0 commit comments

Comments
 (0)