Commit 6556aba36b11f35cd8b8cb6d941bcfc08cc807f8
1 parent
8c14cce3
Exists in
staging
and in
2 other branches
api: filter articles by period
Showing
2 changed files
with
31 additions
and
0 deletions
Show diff stats
lib/noosfero/api/helpers.rb
... | ... | @@ -243,6 +243,16 @@ require_relative '../../find_by_contents' |
243 | 243 | end |
244 | 244 | end |
245 | 245 | |
246 | + def by_period(scope, params, attribute) | |
247 | + from_param = "from_#{attribute}".to_sym | |
248 | + until_param = "until_#{attribute}".to_sym | |
249 | + from_date = DateTime.parse(params.delete(from_param)) if params[from_param] | |
250 | + until_date = DateTime.parse(params.delete(until_param)) if params[until_param] | |
251 | + scope = scope.where("#{attribute} >= ?", from_date) unless from_date.nil? | |
252 | + scope = scope.where("#{attribute} <= ?", until_date) unless until_date.nil? | |
253 | + scope | |
254 | + end | |
255 | + | |
246 | 256 | def select_filtered_collection_of(object, method, params) |
247 | 257 | conditions = make_conditions_with_parameter(params) |
248 | 258 | order = make_order_with_parameters(object,method,params) |
... | ... | @@ -251,6 +261,7 @@ require_relative '../../find_by_contents' |
251 | 261 | objects = object.send(method) |
252 | 262 | objects = by_reference(objects, params) |
253 | 263 | objects = by_categories(objects, params) |
264 | + [:start_date, :end_date].each { |attribute| objects = by_period(objects, params, attribute) } | |
254 | 265 | |
255 | 266 | objects = objects.where(conditions).where(timestamp).reorder(order) |
256 | 267 | ... | ... |
test/api/articles_test.rb
... | ... | @@ -744,4 +744,24 @@ class ArticlesTest < ActiveSupport::TestCase |
744 | 744 | assert_not_includes json['article']['children'].map {|a| a['id']}, child.id |
745 | 745 | end |
746 | 746 | |
747 | + should 'list events with period for start date' do | |
748 | + Article.destroy_all | |
749 | + article1 = fast_create(Event, profile_id: user.person.id, start_date: Time.now) | |
750 | + article2 = fast_create(Event, profile_id: user.person.id, start_date: Time.now + 2.day) | |
751 | + params[:until_start_date] = Time.now + 1.day | |
752 | + get "/api/v1/articles/?#{params.to_query}" | |
753 | + json = JSON.parse(last_response.body) | |
754 | + assert_equal json["articles"].map { |a| a["id"] }, [article1.id] | |
755 | + end | |
756 | + | |
757 | + should 'list events with period for end date' do | |
758 | + Article.destroy_all | |
759 | + article1 = fast_create(Event, profile_id: user.person.id, end_date: Time.now) | |
760 | + article2 = fast_create(Event, profile_id: user.person.id, end_date: Time.now + 2.day) | |
761 | + params[:from_end_date] = Time.now + 1.day | |
762 | + get "/api/v1/articles/?#{params.to_query}" | |
763 | + json = JSON.parse(last_response.body) | |
764 | + assert_equal json["articles"].map { |a| a["id"] }, [article2.id] | |
765 | + end | |
766 | + | |
747 | 767 | end | ... | ... |