From e1aa18b33388901d47476df4a68a1d25f27a9658 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 19 Mar 2016 10:27:55 +0000 Subject: [PATCH] Handle search pagination with the REST API (#6277). git-svn-id: http://svn.redmine.org/redmine/trunk@15264 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/search_controller.rb | 16 ++++++++++++---- app/views/search/index.api.rsb | 2 +- test/integration/api_test/search_test.rb | 18 ++++++++++++++++++ 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 -- 2.39.5