Return only limited pagination headers for search API endpoints

This commit is contained in:
Jarka Kadlecová 2018-02-06 17:53:42 +01:00
parent 7381944565
commit 1b2400b529
7 changed files with 26 additions and 12 deletions

View File

@ -43,7 +43,7 @@ class SearchService
end
def search_objects
@search_objects ||= search_results.objects(scope, params[:page], params[:without_counts])
@search_objects ||= search_results.objects(scope, params[:page])
end
private

View File

@ -12,13 +12,16 @@ module API
private
def add_pagination_headers(paginated_data)
header 'X-Total', paginated_data.total_count.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
header 'X-Prev-Page', paginated_data.prev_page.to_s
header 'Link', pagination_links(paginated_data)
return if data_without_counts?(paginated_data)
header 'X-Total', paginated_data.total_count.to_s
header 'X-Total-Pages', total_pages(paginated_data).to_s
end
def pagination_links(paginated_data)
@ -37,8 +40,10 @@ module API
request_params[:page] = 1
links << %(<#{request_url}?#{request_params.to_query}>; rel="first")
request_params[:page] = total_pages(paginated_data)
links << %(<#{request_url}?#{request_params.to_query}>; rel="last")
unless data_without_counts?(paginated_data)
request_params[:page] = total_pages(paginated_data)
links << %(<#{request_url}?#{request_params.to_query}>; rel="last")
end
links.join(', ')
end
@ -55,6 +60,10 @@ module API
relation
end
def data_without_counts?(paginated_data)
paginated_data.is_a?(Kaminari::PaginatableWithoutCount)
end
end
end
end

View File

@ -24,8 +24,7 @@ module API
search: params[:search],
snippets: snippets?,
page: params[:page],
per_page: params[:per_page],
without_counts: false
per_page: params[:per_page]
}.merge(additional_params)
results = SearchService.new(current_user, search_params).search_objects

View File

@ -10,7 +10,7 @@ module Gitlab
@per_page = per_page
end
def objects(scope, page = nil, without_counts = true)
def objects(scope, page = nil)
case scope
when 'notes'
notes.page(page).per(per_page)
@ -21,7 +21,7 @@ module Gitlab
when 'commits'
Kaminari.paginate_array(commits).page(page).per(per_page)
else
super(scope, page, without_counts)
super(scope, page, false)
end
end

View File

@ -9,14 +9,14 @@ module Gitlab
@query = query
end
def objects(scope, page = nil, without_counts = true)
def objects(scope, page = nil)
case scope
when 'snippet_titles'
snippet_titles.page(page).per(per_page)
when 'snippet_blobs'
snippet_blobs.page(page).per(per_page)
else
super(scope, nil, without_counts)
super(scope, nil, false)
end
end

View File

@ -9,7 +9,7 @@ describe API::Search do
shared_examples 'response is correct' do |schema:, size: 1|
it { expect(response).to have_gitlab_http_status(200) }
it { expect(response).to match_response_schema(schema) }
it { expect(response).to include_pagination_headers }
it { expect(response).to include_limited_pagination_headers }
it { expect(json_response.size).to eq(size) }
end

View File

@ -3,3 +3,9 @@ RSpec::Matchers.define :include_pagination_headers do |expected|
expect(actual.headers).to include('X-Total', 'X-Total-Pages', 'X-Per-Page', 'X-Page', 'X-Next-Page', 'X-Prev-Page', 'Link')
end
end
RSpec::Matchers.define :include_limited_pagination_headers do |expected|
match do |actual|
expect(actual.headers).to include('X-Per-Page', 'X-Page', 'X-Next-Page', 'X-Prev-Page', 'Link')
end
end