Commit 8136b8d20ab72437eef7302232fbd1232e5811da

Authored by Rodrigo Souto
2 parents 34b572e5 9b4cb0ca

Merge branch 'api_pagination' into api

lib/noosfero/api/entities.rb
... ... @@ -33,6 +33,7 @@ module Noosfero
33 33 class Profile < Entity
34 34 expose :identifier, :name, :id
35 35 expose :created_at, :format_with => :timestamp
  36 + expose :updated_at, :format_with => :timestamp
36 37 expose :image, :using => Image
37 38 end
38 39  
... ... @@ -77,6 +78,7 @@ module Noosfero
77 78 expose :body
78 79 expose :abstract
79 80 expose :created_at, :format_with => :timestamp
  81 + expose :updated_at, :format_with => :timestamp
80 82 expose :title, :documentation => {:type => "String", :desc => "Title of the article"}
81 83 expose :created_by, :as => :author, :using => Profile
82 84 expose :profile, :using => Profile
... ...
lib/noosfero/api/helpers.rb
... ... @@ -131,6 +131,26 @@ module Noosfero
131 131 params[:order] || "created_at DESC"
132 132 end
133 133  
  134 + def make_page_number_with_parameters(params)
  135 + params[:page] || 1
  136 + end
  137 +
  138 + def make_per_page_with_parameters(params)
  139 + params[:per_page] ||= limit
  140 + params[:per_page].to_i
  141 + end
  142 +
  143 + def make_timestamp_with_parameters_and_method(params, method)
  144 + timestamp = nil
  145 + if params[:timestamp]
  146 + datetime = DateTime.parse(params[:timestamp])
  147 + table_name = method.to_s.singularize.camelize.constantize.table_name
  148 + timestamp = "#{table_name}.updated_at >= '#{datetime}'"
  149 + end
  150 +
  151 + timestamp
  152 + end
  153 +
134 154 def by_reference(scope, params)
135 155 if params[:reference_id]
136 156 created_at = scope.find(params[:reference_id]).created_at
... ... @@ -143,10 +163,14 @@ module Noosfero
143 163 def select_filtered_collection_of(object, method, params)
144 164 conditions = make_conditions_with_parameter(params)
145 165 order = make_order_with_parameters(params)
  166 + page_number = make_page_number_with_parameters(params)
  167 + per_page = make_per_page_with_parameters(params)
  168 + timestamp = make_timestamp_with_parameters_and_method(params, method)
146 169  
147 170 objects = object.send(method)
148 171 objects = by_reference(objects, params)
149   - objects = objects.where(conditions).limit(limit).order(order)
  172 +
  173 + objects = objects.where(conditions).where(timestamp).page(page_number).per_page(per_page).order(order)
150 174  
151 175 objects
152 176 end
... ...
test/unit/api/articles_test.rb
... ... @@ -82,6 +82,43 @@ class ArticlesTest &lt; ActiveSupport::TestCase
82 82 assert_not_includes json['articles'].map {|a| a['id']}, child.id
83 83 end
84 84  
  85 + should 'list articles with pagination' do
  86 + Article.destroy_all
  87 + article_one = fast_create(Article, :profile_id => user.person.id, :name => "Another thing")
  88 + article_two = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
  89 +
  90 + params[:page] = 1
  91 + params[:per_page] = 1
  92 + get "/api/v1/articles/?#{params.to_query}"
  93 + json_page_one = JSON.parse(last_response.body)
  94 +
  95 + params[:page] = 2
  96 + params[:per_page] = 1
  97 + get "/api/v1/articles/?#{params.to_query}"
  98 + json_page_two = JSON.parse(last_response.body)
  99 +
  100 + assert_includes json_page_one["articles"].map { |a| a["id"] }, article_two.id
  101 + assert_not_includes json_page_one["articles"].map { |a| a["id"] }, article_one.id
  102 +
  103 + assert_includes json_page_two["articles"].map { |a| a["id"] }, article_one.id
  104 + assert_not_includes json_page_two["articles"].map { |a| a["id"] }, article_two.id
  105 + end
  106 +
  107 + should 'list articles with timestamp' do
  108 + article_one = fast_create(Article, :profile_id => user.person.id, :name => "Another thing")
  109 + article_two = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
  110 +
  111 + article_one.updated_at = Time.now + 3.hours
  112 + article_one.save!
  113 +
  114 + params[:timestamp] = Time.now + 1.hours
  115 + get "/api/v1/articles/?#{params.to_query}"
  116 + json = JSON.parse(last_response.body)
  117 +
  118 + assert_includes json["articles"].map { |a| a["id"] }, article_one.id
  119 + assert_not_includes json["articles"].map { |a| a["id"] }, article_two.id
  120 + end
  121 +
85 122 #############################
86 123 # Profile Articles #
87 124 #############################
... ...
test/unit/api/communities_test.rb
... ... @@ -120,4 +120,40 @@ class CommunitiesTest &lt; ActiveSupport::TestCase
120 120 assert_equivalent [c1.id], json['communities'].map {|c| c['id']}
121 121 end
122 122  
  123 + should 'list communities with pagination' do
  124 + community1 = fast_create(Community, :public_profile => true)
  125 + community2 = fast_create(Community)
  126 +
  127 + params[:page] = 2
  128 + params[:per_page] = 1
  129 + get "/api/v1/communities?#{params.to_query}"
  130 + json_page_two = JSON.parse(last_response.body)
  131 +
  132 + params[:page] = 1
  133 + params[:per_page] = 1
  134 + get "/api/v1/communities?#{params.to_query}"
  135 + json_page_one = JSON.parse(last_response.body)
  136 +
  137 +
  138 + assert_includes json_page_one["communities"].map { |a| a["id"] }, community1.id
  139 + assert_not_includes json_page_one["communities"].map { |a| a["id"] }, community2.id
  140 +
  141 + assert_includes json_page_two["communities"].map { |a| a["id"] }, community2.id
  142 + assert_not_includes json_page_two["communities"].map { |a| a["id"] }, community1.id
  143 + end
  144 +
  145 + should 'list communities with timestamp' do
  146 + community1 = fast_create(Community, :public_profile => true)
  147 + community2 = fast_create(Community)
  148 +
  149 + community1.updated_at = Time.now + 3.hours
  150 + community1.save!
  151 +
  152 + params[:timestamp] = Time.now + 1.hours
  153 + get "/api/v1/communities/?#{params.to_query}"
  154 + json = JSON.parse(last_response.body)
  155 +
  156 + assert_includes json["communities"].map { |a| a["id"] }, community1.id
  157 + assert_not_includes json["communities"].map { |a| a["id"] }, community2.id
  158 + end
123 159 end
... ...