diff options
author | Toon Claes <toon@iotcl.com> | 2017-08-17 17:56:01 +0200 |
---|---|---|
committer | Toon Claes <toon@iotcl.com> | 2017-08-17 21:47:01 +0200 |
commit | e17d9529faa4d292d7f869a0f9ebbbcde4cc6f9e (patch) | |
tree | 18a73c81e978dfb2828f38d793f35e1e7da55d77 | |
parent | a98d17a83877cd885a92aac29a9cb13d13a53a86 (diff) | |
download | gitlab-ce-tc-git-tower-pagination-links.tar.gz |
Total Pages should be at least onetc-git-tower-pagination-links
And the link to the last page cannot be `page=0`.
-rw-r--r-- | lib/api/helpers/pagination.rb | 17 | ||||
-rw-r--r-- | spec/lib/api/helpers/pagination_spec.rb | 3 |
2 files changed, 13 insertions, 7 deletions
diff --git a/lib/api/helpers/pagination.rb b/lib/api/helpers/pagination.rb index e86e221e092..95108292aac 100644 --- a/lib/api/helpers/pagination.rb +++ b/lib/api/helpers/pagination.rb @@ -11,7 +11,7 @@ module API def add_pagination_headers(paginated_data) header 'X-Total', paginated_data.total_count.to_s - header 'X-Total-Pages', paginated_data.total_pages.to_s + header 'X-Total-Pages', total_pages(paginated_data).to_s header 'X-Per-Page', paginated_data.limit_value.to_s header 'X-Page', paginated_data.current_page.to_s header 'X-Next-Page', paginated_data.next_page.to_s @@ -26,20 +26,25 @@ module API links = [] - request_params[:page] = paginated_data.current_page - 1 - links << %(<#{request_url}?#{request_params.to_query}>; rel="prev") unless paginated_data.first_page? + request_params[:page] = paginated_data.prev_page + links << %(<#{request_url}?#{request_params.to_query}>; rel="prev") if request_params[:page] - request_params[:page] = paginated_data.current_page + 1 - links << %(<#{request_url}?#{request_params.to_query}>; rel="next") unless paginated_data.last_page? || paginated_data.out_of_range? + request_params[:page] = paginated_data.next_page + links << %(<#{request_url}?#{request_params.to_query}>; rel="next") if request_params[:page] request_params[:page] = 1 links << %(<#{request_url}?#{request_params.to_query}>; rel="first") - request_params[:page] = paginated_data.total_pages + request_params[:page] = total_pages(paginated_data) links << %(<#{request_url}?#{request_params.to_query}>; rel="last") links.join(', ') end + + def total_pages(paginated_data) + # Ensure there is in total at least 1 page + [paginated_data.total_pages, 1].max + end end end end diff --git a/spec/lib/api/helpers/pagination_spec.rb b/spec/lib/api/helpers/pagination_spec.rb index 041c40d9490..59deca7757b 100644 --- a/spec/lib/api/helpers/pagination_spec.rb +++ b/spec/lib/api/helpers/pagination_spec.rb @@ -107,7 +107,7 @@ describe API::Helpers::Pagination do it 'adds appropriate headers' do expect_header('X-Total', '0') - expect_header('X-Total-Pages', '0') + expect_header('X-Total-Pages', '1') expect_header('X-Per-Page', '2') expect_header('X-Page', '1') expect_header('X-Next-Page', '') @@ -118,6 +118,7 @@ describe API::Helpers::Pagination do expect(val).to include('rel="last"') expect(val).not_to include('rel="prev"') expect(val).not_to include('rel="next"') + expect(val).not_to include('page=0') end subject.paginate(resource) |