Commit 8136b8d20ab72437eef7302232fbd1232e5811da
Exists in
master
and in
29 other branches
Merge branch 'api_pagination' into api
Showing
4 changed files
with
100 additions
and
1 deletions
Show diff stats
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 < 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 < 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 | ... | ... |