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:
parent
1ee7f31f4d
commit
d076c19822
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue