summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2016-03-19 10:27:55 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2016-03-19 10:27:55 +0000
commite1aa18b33388901d47476df4a68a1d25f27a9658 (patch)
tree01da270d019d1df51f4a4f4a7fd4a488a2e7f5f4
parent7a812815833f0320d3b2d52ac71af63f324b0028 (diff)
downloadredmine-e1aa18b33388901d47476df4a68a1d25f27a9658.tar.gz
redmine-e1aa18b33388901d47476df4a68a1d25f27a9658.zip
Handle search pagination with the REST API (#6277).
git-svn-id: http://svn.redmine.org/redmine/trunk@15264 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/search_controller.rb16
-rw-r--r--app/views/search/index.api.rsb2
-rw-r--r--test/integration/api_test/search_test.rb18
3 files changed, 31 insertions, 5 deletions
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index ee8c83879..2888a8889 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -27,6 +27,15 @@ class SearchController < ApplicationController
@search_attachments = params[:attachments].presence || '0'
@open_issues = params[:open_issues] ? params[:open_issues].present? : false
+ case params[:format]
+ when 'xml', 'json'
+ @offset, @limit = api_offset_and_limit
+ else
+ @offset = nil
+ @limit = Setting.search_results_per_page.to_i
+ @limit = 10 if @limit == 0
+ end
+
# quick jump to an issue
if (m = @question.match(/^#?(\d+)$/)) && (issue = Issue.visible.find_by_id(m[1].to_i))
redirect_to issue_path(issue)
@@ -67,10 +76,9 @@ class SearchController < ApplicationController
@result_count_by_type = fetcher.result_count_by_type
@tokens = fetcher.tokens
- per_page = Setting.search_results_per_page.to_i
- per_page = 10 if per_page == 0
- @result_pages = Paginator.new @result_count, per_page, params['page']
- @results = fetcher.results(@result_pages.offset, @result_pages.per_page)
+ @result_pages = Paginator.new @result_count, @limit, params['page']
+ @offset ||= @result_pages.offset
+ @results = fetcher.results(@offset, @result_pages.per_page)
else
@question = ""
end
diff --git a/app/views/search/index.api.rsb b/app/views/search/index.api.rsb
index 831f04b5f..6619c00e3 100644
--- a/app/views/search/index.api.rsb
+++ b/app/views/search/index.api.rsb
@@ -1,4 +1,4 @@
-api.array :results do
+api.array :results, api_meta(:total_count => @result_count, :offset => @offset, :limit => @limit) do
@results.each do |result|
api.result do
api.id result.id
diff --git a/test/integration/api_test/search_test.rb b/test/integration/api_test/search_test.rb
index 9ec115409..21351ce83 100644
--- a/test/integration/api_test/search_test.rb
+++ b/test/integration/api_test/search_test.rb
@@ -71,4 +71,22 @@ class Redmine::ApiTest::SearchTest < Redmine::ApiTest::Base
end
end
end
+
+ test "GET /search.xml should paginate" do
+ issue = (0..10).map {Issue.generate! :subject => 'search_with_limited_results'}.reverse.map(&:id)
+
+ get '/search.json', :q => 'search_with_limited_results', :limit => 4
+ json = ActiveSupport::JSON.decode(response.body)
+ assert_equal 11, json['total_count']
+ assert_equal 0, json['offset']
+ assert_equal 4, json['limit']
+ assert_equal issue[0..3], json['results'].map {|r| r['id']}
+
+ get '/search.json', :q => 'search_with_limited_results', :offset => 8, :limit => 4
+ json = ActiveSupport::JSON.decode(response.body)
+ assert_equal 11, json['total_count']
+ assert_equal 8, json['offset']
+ assert_equal 4, json['limit']
+ assert_equal issue[8..10], json['results'].map {|r| r['id']}
+ end
end