mirror of
https://github.com/discourse/discourse.git
synced 2025-02-20 11:48:26 -06:00
FIX: don't allow storage of post timings batch larger than 60 secs
This commit is contained in:
parent
8feaa5c613
commit
5eabf01c29
@ -68,21 +68,27 @@ class PostTiming < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
MAX_READ_TIME_PER_BATCH = 60*1000.0
|
||||||
|
|
||||||
def self.process_timings(current_user, topic_id, topic_time, timings)
|
def self.process_timings(current_user, topic_id, topic_time, timings)
|
||||||
current_user.user_stat.update_time_read!
|
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
|
highest_seen = 1
|
||||||
|
|
||||||
join_table = []
|
join_table = []
|
||||||
|
|
||||||
timings = timings.find_all do |post_number, time|
|
i = timings.length
|
||||||
post_number >= 0 && time < account_age_msecs
|
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
|
end
|
||||||
|
|
||||||
timings.each_with_index do |(post_number, time), index|
|
timings.each_with_index do |(post_number, time), index|
|
||||||
|
|
||||||
join_table << "SELECT #{topic_id.to_i} topic_id, #{post_number.to_i} post_number,
|
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"
|
#{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]})
|
total_changed = Notification.mark_posts_read(current_user, topic_id, timings.map{|t| t[0]})
|
||||||
end
|
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)
|
TopicUser.update_last_read(current_user, topic_id, highest_seen, topic_time)
|
||||||
|
|
||||||
if total_changed > 0
|
if total_changed > 0
|
||||||
|
@ -71,7 +71,7 @@ describe PostTiming do
|
|||||||
|
|
||||||
PostTiming.process_timings(user, post.topic_id, 1, [[post.post_number, 10.minutes.to_i * 1000]])
|
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]
|
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
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -85,7 +85,7 @@ describe PostTiming do
|
|||||||
ActiveRecord::Base.observers.enable :all
|
ActiveRecord::Base.observers.enable :all
|
||||||
|
|
||||||
post = Fabricate(:post)
|
post = Fabricate(:post)
|
||||||
user2 = Fabricate(:coding_horror)
|
user2 = Fabricate(:coding_horror, created_at: 1.day.ago)
|
||||||
|
|
||||||
PostAction.act(user2, post, PostActionType.types[:like])
|
PostAction.act(user2, post, PostActionType.types[:like])
|
||||||
|
|
||||||
@ -96,6 +96,8 @@ describe PostTiming do
|
|||||||
post.user.reload
|
post.user.reload
|
||||||
expect(post.user.unread_notifications).to eq(0)
|
expect(post.user.unread_notifications).to eq(0)
|
||||||
|
|
||||||
|
PostTiming.process_timings(post.user, post.topic_id, 1, [[post.post_number, 1.day]])
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user