diff --git a/app/models/post_timing.rb b/app/models/post_timing.rb index 26d50f0e385..3afd1f77815 100644 --- a/app/models/post_timing.rb +++ b/app/models/post_timing.rb @@ -68,21 +68,27 @@ class PostTiming < ActiveRecord::Base end end + MAX_READ_TIME_PER_BATCH = 60*1000.0 def self.process_timings(current_user, topic_id, topic_time, timings) current_user.user_stat.update_time_read! - account_age_msecs = ((Time.now - current_user.created_at) * 1000.0) + max_time_per_post = ((Time.now - current_user.created_at) * 1000.0) + max_time_per_post = MAX_READ_TIME_PER_BATCH if max_time_per_post > MAX_READ_TIME_PER_BATCH highest_seen = 1 join_table = [] - timings = timings.find_all do |post_number, time| - post_number >= 0 && time < account_age_msecs + i = timings.length + while i > 0 + i -= 1 + timings[i][1] = max_time_per_post if timings[i][1] > max_time_per_post + timings.delete_at(i) if timings[i][0] < 1 end timings.each_with_index do |(post_number, time), index| + join_table << "SELECT #{topic_id.to_i} topic_id, #{post_number.to_i} post_number, #{current_user.id.to_i} user_id, #{time.to_i} msecs, #{index} idx" @@ -122,6 +128,7 @@ SQL total_changed = Notification.mark_posts_read(current_user, topic_id, timings.map{|t| t[0]}) end + topic_time = max_time_per_post if topic_time > max_time_per_post TopicUser.update_last_read(current_user, topic_id, highest_seen, topic_time) if total_changed > 0 diff --git a/spec/models/post_timing_spec.rb b/spec/models/post_timing_spec.rb index 002ba5729c3..beb39c3d57d 100644 --- a/spec/models/post_timing_spec.rb +++ b/spec/models/post_timing_spec.rb @@ -71,7 +71,7 @@ describe PostTiming do PostTiming.process_timings(user, post.topic_id, 1, [[post.post_number, 10.minutes.to_i * 1000]]) msecs = PostTiming.where(post_number: post.post_number, user_id: user.id).pluck(:msecs)[0] - expect(msecs).to eq(123) + expect(msecs).to eq(123 + PostTiming::MAX_READ_TIME_PER_BATCH) end end @@ -85,7 +85,7 @@ describe PostTiming do ActiveRecord::Base.observers.enable :all post = Fabricate(:post) - user2 = Fabricate(:coding_horror) + user2 = Fabricate(:coding_horror, created_at: 1.day.ago) PostAction.act(user2, post, PostActionType.types[:like]) @@ -96,6 +96,8 @@ describe PostTiming do post.user.reload expect(post.user.unread_notifications).to eq(0) + PostTiming.process_timings(post.user, post.topic_id, 1, [[post.post_number, 1.day]]) + end end