]> source.dussan.org Git - redmine.git/commitdiff
Makes API accept offset/limit or page/limit parameters for retrieving collections.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Thu, 23 Dec 2010 13:33:01 +0000 (13:33 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Thu, 23 Dec 2010 13:33:01 +0000 (13:33 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4571 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/application_controller.rb
test/functional/application_controller_test.rb

index 40bdda06bf014173e616dec651906a764996ce8f..7c84b99f6aef8580b3fad109cdb24520730eded3 100644 (file)
@@ -349,20 +349,27 @@ class ApplicationController < ActionController::Base
     per_page
   end
 
-  def api_offset_and_limit
-    offset = nil
-    if params[:offset].present?
-      offset = params[:offset].to_i
+  # Returns offset and limit used to retrieve objects
+  # for an API response based on offset, limit and page parameters
+  def api_offset_and_limit(options=params)
+    if options[:offset].present?
+      offset = options[:offset].to_i
       if offset < 0
         offset = 0
       end
     end
-    limit = params[:limit].to_i
+    limit = options[:limit].to_i
     if limit < 1
       limit = 25
     elsif limit > 100
       limit = 100
     end
+    if offset.nil? && options[:page].present?
+      offset = (options[:page].to_i - 1) * limit
+      offset = 0 if offset < 0
+    end
+    offset ||= 0
+    
     [offset, limit]
   end
   
index a37f7de23a711b62d3aefa19abb77ea986b37917..57f3e091cd25936d62c5a074da91a096dffebcf1 100644 (file)
@@ -43,4 +43,61 @@ class ApplicationControllerTest < ActionController::TestCase
   def test_call_hook_mixed_in
     assert @controller.respond_to?(:call_hook)
   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