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 | ... | ... |