Commit e30dab143da2636bb3ab5a5335c7dceaff77a58e
1 parent
8e1ebf5b
Exists in
fix_sign_up_form
should limit the number of activities returned by activities endpoint
Showing
3 changed files
with
87 additions
and
17 deletions
Show diff stats
app/api/helpers.rb
| @@ -187,6 +187,28 @@ module Api | @@ -187,6 +187,28 @@ module Api | ||
| 187 | present_partial tasks, :with => Entities::Task | 187 | present_partial tasks, :with => Entities::Task |
| 188 | end | 188 | end |
| 189 | 189 | ||
| 190 | + ########################### | ||
| 191 | + # Activities # | ||
| 192 | + ########################### | ||
| 193 | + def find_activities(asset, method_or_relation = 'activities') | ||
| 194 | + | ||
| 195 | + not_found! if asset.blank? || asset.secret || !asset.visible | ||
| 196 | + forbidden! if !asset.display_private_info_to?(current_person) | ||
| 197 | + | ||
| 198 | + activities = select_filtered_collection_of(asset, method_or_relation, params) | ||
| 199 | + activities = activities.map(&:activity) | ||
| 200 | + activities | ||
| 201 | + end | ||
| 202 | + | ||
| 203 | + def present_activities_for_asset(asset, method_or_relation = 'activities') | ||
| 204 | + tasks = find_activities(asset, method_or_relation) | ||
| 205 | + present_activities(tasks) | ||
| 206 | + end | ||
| 207 | + | ||
| 208 | + def present_activities(activities) | ||
| 209 | + present_partial activities, :with => Entities::Activity, :current_person => current_person | ||
| 210 | + end | ||
| 211 | + | ||
| 190 | def make_conditions_with_parameter(params = {}) | 212 | def make_conditions_with_parameter(params = {}) |
| 191 | parsed_params = parser_params(params) | 213 | parsed_params = parser_params(params) |
| 192 | conditions = {} | 214 | conditions = {} |
| @@ -210,7 +232,7 @@ module Api | @@ -210,7 +232,7 @@ module Api | ||
| 210 | order = 'RANDOM()' | 232 | order = 'RANDOM()' |
| 211 | else | 233 | else |
| 212 | field_name, direction = params[:order].split(' ') | 234 | field_name, direction = params[:order].split(' ') |
| 213 | - assoc_class = extract_associated_classname(method_or_relation) | 235 | + assoc_class = extract_associated_classname(object, smethod_or_relation) |
| 214 | if !field_name.blank? and assoc_class | 236 | if !field_name.blank? and assoc_class |
| 215 | if assoc_class.attribute_names.include? field_name | 237 | if assoc_class.attribute_names.include? field_name |
| 216 | if direction.present? and ['ASC','DESC'].include? direction.upcase | 238 | if direction.present? and ['ASC','DESC'].include? direction.upcase |
| @@ -223,12 +245,12 @@ module Api | @@ -223,12 +245,12 @@ module Api | ||
| 223 | return order | 245 | return order |
| 224 | end | 246 | end |
| 225 | 247 | ||
| 226 | - def make_timestamp_with_parameters_and_method(params, method_or_relation) | 248 | + def make_timestamp_with_parameters_and_method(object, method_or_relation, params) |
| 227 | timestamp = nil | 249 | timestamp = nil |
| 228 | if params[:timestamp] | 250 | if params[:timestamp] |
| 229 | datetime = DateTime.parse(params[:timestamp]) | 251 | datetime = DateTime.parse(params[:timestamp]) |
| 230 | - table_name = extract_associated_tablename(method_or_relation) | ||
| 231 | - assoc_class = extract_associated_classname(method_or_relation) | 252 | + table_name = extract_associated_tablename(object, method_or_relation) |
| 253 | + assoc_class = extract_associated_classname(object, method_or_relation) | ||
| 232 | date_atrr = assoc_class.attribute_names.include?('updated_at') ? 'updated_at' : 'created_at' | 254 | date_atrr = assoc_class.attribute_names.include?('updated_at') ? 'updated_at' : 'created_at' |
| 233 | timestamp = "#{table_name}.#{date_atrr} >= '#{datetime}'" | 255 | timestamp = "#{table_name}.#{date_atrr} >= '#{datetime}'" |
| 234 | end | 256 | end |
| @@ -258,7 +280,7 @@ module Api | @@ -258,7 +280,7 @@ module Api | ||
| 258 | def select_filtered_collection_of(object, method_or_relation, params) | 280 | def select_filtered_collection_of(object, method_or_relation, params) |
| 259 | conditions = make_conditions_with_parameter(params) | 281 | conditions = make_conditions_with_parameter(params) |
| 260 | order = make_order_with_parameters(object,method_or_relation,params) | 282 | order = make_order_with_parameters(object,method_or_relation,params) |
| 261 | - timestamp = make_timestamp_with_parameters_and_method(params, method_or_relation) | 283 | + timestamp = make_timestamp_with_parameters_and_method(object, method_or_relation, params) |
| 262 | 284 | ||
| 263 | objects = is_a_relation?(method_or_relation) ? method_or_relation : object.send(method_or_relation) | 285 | objects = is_a_relation?(method_or_relation) ? method_or_relation : object.send(method_or_relation) |
| 264 | objects = by_reference(objects, params) | 286 | objects = by_reference(objects, params) |
| @@ -406,15 +428,15 @@ module Api | @@ -406,15 +428,15 @@ module Api | ||
| 406 | end | 428 | end |
| 407 | private | 429 | private |
| 408 | 430 | ||
| 409 | - def extract_associated_tablename(method_or_relation) | ||
| 410 | - extract_associated_classname(method_or_relation).table_name | 431 | + def extract_associated_tablename(object, method_or_relation) |
| 432 | + extract_associated_classname(object, method_or_relation).table_name | ||
| 411 | end | 433 | end |
| 412 | 434 | ||
| 413 | - def extract_associated_classname(method_or_relation) | 435 | + def extract_associated_classname(object, method_or_relation) |
| 414 | if is_a_relation?(method_or_relation) | 436 | if is_a_relation?(method_or_relation) |
| 415 | method_or_relation.blank? ? '' : method_or_relation.first.class | 437 | method_or_relation.blank? ? '' : method_or_relation.first.class |
| 416 | else | 438 | else |
| 417 | - method_or_relation.to_s.singularize.camelize.constantize | 439 | + object.send(method_or_relation).table_name.singularize.camelize.constantize |
| 418 | end | 440 | end |
| 419 | end | 441 | end |
| 420 | 442 |
app/api/v1/activities.rb
| @@ -5,13 +5,8 @@ module Api | @@ -5,13 +5,8 @@ module Api | ||
| 5 | resource :profiles do | 5 | resource :profiles do |
| 6 | 6 | ||
| 7 | get ':id/activities' do | 7 | get ':id/activities' do |
| 8 | - profile = Profile.find_by id: params[:id] | ||
| 9 | - | ||
| 10 | - not_found! if profile.blank? || profile.secret || !profile.visible | ||
| 11 | - forbidden! if !profile.display_private_info_to?(current_person) | ||
| 12 | - | ||
| 13 | - activities = profile.activities.map(&:activity) | ||
| 14 | - present activities, :with => Entities::Activity, :current_person => current_person | 8 | + profile = environment.profiles.find_by id: params[:id] |
| 9 | + present_activities_for_asset(profile) | ||
| 15 | end | 10 | end |
| 16 | end | 11 | end |
| 17 | end | 12 | end |
test/api/activities_test.rb
| @@ -131,9 +131,62 @@ class ActivitiesTest < ActiveSupport::TestCase | @@ -131,9 +131,62 @@ class ActivitiesTest < ActiveSupport::TestCase | ||
| 131 | assert_nil json["activities"].last['content'] | 131 | assert_nil json["activities"].last['content'] |
| 132 | end | 132 | end |
| 133 | 133 | ||
| 134 | + should 'list activities with pagination' do | ||
| 135 | + ActionTracker::Record.destroy_all | ||
| 136 | + a1 = create_activity(:target => person) | ||
| 137 | + a2 = create_activity(:target => person) | ||
| 138 | + | ||
| 139 | + params[:page] = 1 | ||
| 140 | + params[:per_page] = 1 | ||
| 141 | + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" | ||
| 142 | + json_page_one = JSON.parse(last_response.body) | ||
| 143 | + | ||
| 144 | + params[:page] = 2 | ||
| 145 | + params[:per_page] = 1 | ||
| 146 | + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" | ||
| 147 | + json_page_two = JSON.parse(last_response.body) | ||
| 148 | + | ||
| 149 | + assert_includes json_page_one["activities"].map { |a| a["id"] }, a2.id | ||
| 150 | + assert_not_includes json_page_one["activities"].map { |a| a["id"] }, a1.id | ||
| 151 | + | ||
| 152 | + assert_includes json_page_two["activities"].map { |a| a["id"] }, a1.id | ||
| 153 | + assert_not_includes json_page_two["activities"].map { |a| a["id"] }, a2.id | ||
| 154 | + end | ||
| 155 | + | ||
| 156 | + should 'list only 20 elements by page if no limit param is passed' do | ||
| 157 | + ActionTracker::Record.destroy_all | ||
| 158 | + 1.upto(25).map do | ||
| 159 | + create_activity(:target => person) | ||
| 160 | + end | ||
| 161 | + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" | ||
| 162 | + json = JSON.parse(last_response.body) | ||
| 163 | + assert_equal 20, json["activities"].length | ||
| 164 | + end | ||
| 165 | + | ||
| 166 | + should 'list activities with timestamp' do | ||
| 167 | + ActionTracker::Record.destroy_all | ||
| 168 | + a1 = create_activity(:target => person) | ||
| 169 | + a2 = create_activity(:target => person) | ||
| 170 | + a2.updated_at = Time.zone.now | ||
| 171 | + a2.save | ||
| 172 | + | ||
| 173 | + a1.updated_at = Time.zone.now + 3.hours | ||
| 174 | + a1.save! | ||
| 175 | + | ||
| 176 | + | ||
| 177 | + params[:timestamp] = Time.zone.now + 1.hours | ||
| 178 | + get "/api/v1/profiles/#{person.id}/activities?#{params.to_query}" | ||
| 179 | + json = JSON.parse(last_response.body) | ||
| 180 | + | ||
| 181 | + assert_includes json["activities"].map { |a| a["id"] }, a1.id | ||
| 182 | + assert_not_includes json["activities"].map { |a| a["id"] }, a2.id | ||
| 183 | + end | ||
| 184 | + | ||
| 185 | + | ||
| 186 | + | ||
| 134 | def create_activity(params = {}) | 187 | def create_activity(params = {}) |
| 135 | params[:verb] ||= 'create_article' | 188 | params[:verb] ||= 'create_article' |
| 136 | - ActionTracker::Record.create! :verb => params[:verb], :user => person, :target => params[:target] | 189 | + ActionTracker::Record.create!(params.merge(:user => person)) |
| 137 | end | 190 | end |
| 138 | 191 | ||
| 139 | end | 192 | end |