From e30dab143da2636bb3ab5a5335c7dceaff77a58e Mon Sep 17 00:00:00 2001 From: Leandro Nunes dos Santos Date: Tue, 26 Jul 2016 10:56:20 -0300 Subject: [PATCH] should limit the number of activities returned by activities endpoint --- app/api/helpers.rb | 40 +++++++++++++++++++++++++++++++--------- app/api/v1/activities.rb | 9 ++------- test/api/activities_test.rb | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 87 insertions(+), 17 deletions(-) diff --git a/app/api/helpers.rb b/app/api/helpers.rb index 172fa75..97dc03e 100644 --- a/app/api/helpers.rb +++ b/app/api/helpers.rb @@ -187,6 +187,28 @@ module Api present_partial tasks, :with => Entities::Task end + ########################### + # Activities # + ########################### + def find_activities(asset, method_or_relation = 'activities') + + not_found! if asset.blank? || asset.secret || !asset.visible + forbidden! if !asset.display_private_info_to?(current_person) + + activities = select_filtered_collection_of(asset, method_or_relation, params) + activities = activities.map(&:activity) + activities + end + + def present_activities_for_asset(asset, method_or_relation = 'activities') + tasks = find_activities(asset, method_or_relation) + present_activities(tasks) + end + + def present_activities(activities) + present_partial activities, :with => Entities::Activity, :current_person => current_person + end + def make_conditions_with_parameter(params = {}) parsed_params = parser_params(params) conditions = {} @@ -210,7 +232,7 @@ module Api order = 'RANDOM()' else field_name, direction = params[:order].split(' ') - assoc_class = extract_associated_classname(method_or_relation) + assoc_class = extract_associated_classname(object, smethod_or_relation) if !field_name.blank? and assoc_class if assoc_class.attribute_names.include? field_name if direction.present? and ['ASC','DESC'].include? direction.upcase @@ -223,12 +245,12 @@ module Api return order end - def make_timestamp_with_parameters_and_method(params, method_or_relation) + def make_timestamp_with_parameters_and_method(object, method_or_relation, params) timestamp = nil if params[:timestamp] datetime = DateTime.parse(params[:timestamp]) - table_name = extract_associated_tablename(method_or_relation) - assoc_class = extract_associated_classname(method_or_relation) + table_name = extract_associated_tablename(object, method_or_relation) + assoc_class = extract_associated_classname(object, method_or_relation) date_atrr = assoc_class.attribute_names.include?('updated_at') ? 'updated_at' : 'created_at' timestamp = "#{table_name}.#{date_atrr} >= '#{datetime}'" end @@ -258,7 +280,7 @@ module Api def select_filtered_collection_of(object, method_or_relation, params) conditions = make_conditions_with_parameter(params) order = make_order_with_parameters(object,method_or_relation,params) - timestamp = make_timestamp_with_parameters_and_method(params, method_or_relation) + timestamp = make_timestamp_with_parameters_and_method(object, method_or_relation, params) objects = is_a_relation?(method_or_relation) ? method_or_relation : object.send(method_or_relation) objects = by_reference(objects, params) @@ -406,15 +428,15 @@ module Api end private - def extract_associated_tablename(method_or_relation) - extract_associated_classname(method_or_relation).table_name + def extract_associated_tablename(object, method_or_relation) + extract_associated_classname(object, method_or_relation).table_name end - def extract_associated_classname(method_or_relation) + def extract_associated_classname(object, method_or_relation) if is_a_relation?(method_or_relation) method_or_relation.blank? ? '' : method_or_relation.first.class else - method_or_relation.to_s.singularize.camelize.constantize + object.send(method_or_relation).table_name.singularize.camelize.constantize end end diff --git a/app/api/v1/activities.rb b/app/api/v1/activities.rb index e29245b..4d9da55 100644 --- a/app/api/v1/activities.rb +++ b/app/api/v1/activities.rb @@ -5,13 +5,8 @@ module Api resource :profiles do get ':id/activities' do - profile = Profile.find_by id: params[:id] - - not_found! if profile.blank? || profile.secret || !profile.visible - forbidden! if !profile.display_private_info_to?(current_person) - - activities = profile.activities.map(&:activity) - present activities, :with => Entities::Activity, :current_person => current_person + profile = environment.profiles.find_by id: params[:id] + present_activities_for_asset(profile) end end end diff --git a/test/api/activities_test.rb b/test/api/activities_test.rb index 4b0d983..c7f691a 100644 --- a/test/api/activities_test.rb +++ b/test/api/activities_test.rb @@ -131,9 +131,62 @@ class ActivitiesTest < ActiveSupport::TestCase assert_nil json["activities"].last['content'] end + should 'list activities with pagination' do + ActionTracker::Record.destroy_all + a1 = create_activity(:target => person) + a2 = create_activity(:target => person) + + params[:page] = 1 + params[:per_page] = 1 + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" + json_page_one = JSON.parse(last_response.body) + + params[:page] = 2 + params[:per_page] = 1 + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" + json_page_two = JSON.parse(last_response.body) + + assert_includes json_page_one["activities"].map { |a| a["id"] }, a2.id + assert_not_includes json_page_one["activities"].map { |a| a["id"] }, a1.id + + assert_includes json_page_two["activities"].map { |a| a["id"] }, a1.id + assert_not_includes json_page_two["activities"].map { |a| a["id"] }, a2.id + end + + should 'list only 20 elements by page if no limit param is passed' do + ActionTracker::Record.destroy_all + 1.upto(25).map do + create_activity(:target => person) + end + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" + json = JSON.parse(last_response.body) + assert_equal 20, json["activities"].length + end + + should 'list activities with timestamp' do + ActionTracker::Record.destroy_all + a1 = create_activity(:target => person) + a2 = create_activity(:target => person) + a2.updated_at = Time.zone.now + a2.save + + a1.updated_at = Time.zone.now + 3.hours + a1.save! + + + params[:timestamp] = Time.zone.now + 1.hours + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" + json = JSON.parse(last_response.body) + + assert_includes json["activities"].map { |a| a["id"] }, a1.id + assert_not_includes json["activities"].map { |a| a["id"] }, a2.id + end + + + def create_activity(params = {}) params[:verb] ||= 'create_article' - ActionTracker::Record.create! :verb => params[:verb], :user => person, :target => params[:target] + ActionTracker::Record.create!(params.merge(:user => person)) end end -- libgit2 0.21.2