Commit 0a0a6604 authored by Jarka Kadlecová's avatar Jarka Kadlecová
Browse files

Return only limited pagination headers for search API endpoints

parent 09fdbaeb577f
......@@ -43,7 +43,7 @@ def search_results
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
......
......@@ -12,13 +12,16 @@ def paginate(relation)
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 @@ def pagination_links(paginated_data)
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 @@ def add_default_order(relation)
relation
end
def data_without_counts?(paginated_data)
paginated_data.is_a?(Kaminari::PaginatableWithoutCount)
end
end
end
end
......@@ -24,8 +24,7 @@ def search(additional_params = {})
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
......
......@@ -10,7 +10,7 @@ def initialize(current_user, project, query, repository_ref = nil, per_page: 20)
@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 @@ def objects(scope, page = nil, without_counts = true)
when 'commits'
Kaminari.paginate_array(commits).page(page).per(per_page)
else
super(scope, page, without_counts)
super(scope, page, false)
end
end
......
......@@ -9,14 +9,14 @@ def initialize(limit_snippets, query)
@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
......
......@@ -9,7 +9,7 @@
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
......
......@@ -3,3 +3,9 @@
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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment