Makes API accept offset/limit or page/limit parameters for retrieving collections.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4571 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang 2010-12-23 13:33:01 +00:00
parent 1ee7f31f4d
commit d076c19822
2 changed files with 69 additions and 5 deletions

View File

@ -349,20 +349,27 @@ class ApplicationController < ActionController::Base
per_page per_page
end end
def api_offset_and_limit # Returns offset and limit used to retrieve objects
offset = nil # for an API response based on offset, limit and page parameters
if params[:offset].present? def api_offset_and_limit(options=params)
offset = params[:offset].to_i if options[:offset].present?
offset = options[:offset].to_i
if offset < 0 if offset < 0
offset = 0 offset = 0
end end
end end
limit = params[:limit].to_i limit = options[:limit].to_i
if limit < 1 if limit < 1
limit = 25 limit = 25
elsif limit > 100 elsif limit > 100
limit = 100 limit = 100
end end
if offset.nil? && options[:page].present?
offset = (options[:page].to_i - 1) * limit
offset = 0 if offset < 0
end
offset ||= 0
[offset, limit] [offset, limit]
end end

View File

@ -43,4 +43,61 @@ class ApplicationControllerTest < ActionController::TestCase
def test_call_hook_mixed_in def test_call_hook_mixed_in
assert @controller.respond_to?(:call_hook) assert @controller.respond_to?(:call_hook)
end end
context "test_api_offset_and_limit" do
context "without params" do
should "return 0, 25" do
assert_equal [0, 25], @controller.api_offset_and_limit({})
end
end
context "with limit" do
should "return 0, limit" do
assert_equal [0, 30], @controller.api_offset_and_limit({:limit => 30})
end
should "not exceed 100" do
assert_equal [0, 100], @controller.api_offset_and_limit({:limit => 120})
end
should "not be negative" do
assert_equal [0, 25], @controller.api_offset_and_limit({:limit => -10})
end
end
context "with offset" do
should "return offset, 25" do
assert_equal [10, 25], @controller.api_offset_and_limit({:offset => 10})
end
should "not be negative" do
assert_equal [0, 25], @controller.api_offset_and_limit({:offset => -10})
end
context "and limit" do
should "return offset, limit" do
assert_equal [10, 50], @controller.api_offset_and_limit({:offset => 10, :limit => 50})
end
end
end
context "with page" do
should "return offset, 25" do
assert_equal [0, 25], @controller.api_offset_and_limit({:page => 1})
assert_equal [50, 25], @controller.api_offset_and_limit({:page => 3})
end
should "not be negative" do
assert_equal [0, 25], @controller.api_offset_and_limit({:page => 0})
assert_equal [0, 25], @controller.api_offset_and_limit({:page => -2})
end
context "and limit" do
should "return offset, limit" do
assert_equal [0, 100], @controller.api_offset_and_limit({:page => 1, :limit => 100})
assert_equal [200, 100], @controller.api_offset_and_limit({:page => 3, :limit => 100})
end
end
end
end
end end