diff --git a/app/models/forum_topic.rb b/app/models/forum_topic.rb index 4183bb32a..4a4acf150 100644 --- a/app/models/forum_topic.rb +++ b/app/models/forum_topic.rb @@ -128,9 +128,25 @@ class ForumTopic < ActiveRecord::Base ids = result.scan(/\S+/) result = ids[(ids.size / 2)..-1].join(" ") end + update_last_forum_read_at(hash.keys) result end + def update_last_forum_read_at(read_forum_topic_ids) + query = ForumTopic.scoped + if CurrentUser.user.last_forum_read_at.present? + query = query.where("updated_at > ?", CurrentUser.last_forum_read_at) + end + if read_forum_topic_ids.any? + query = query.where("id not in (?)", read_forum_topic_ids) + end + query = query.order("updated_at asc") + topic = query.first + if topic + CurrentUser.user.update_attribute(:last_forum_read_at, topic.updated_at) + end + end + def merge(topic) ForumPost.update_all({:topic_id => id}, :id => topic.posts.map(&:id)) update_attribute(:is_deleted, true) diff --git a/test/unit/forum_topic_test.rb b/test/unit/forum_topic_test.rb index a5a1dd8e7..d549f1928 100644 --- a/test/unit/forum_topic_test.rb +++ b/test/unit/forum_topic_test.rb @@ -14,6 +14,45 @@ class ForumTopicTest < ActiveSupport::TestCase CurrentUser.ip_addr = nil end + context "#update_last_forum_read_at" do + setup do + @topics = [@topic] + 1.upto(6) do |i| + Timecop.travel(i.days.from_now) do + @topics << FactoryGirl.create(:forum_topic, :title => "xxx") + end + end + @read_forum_topic_ids = [] + @read_forum_topic_ids << @topics[0] + @read_forum_topic_ids << @topics[2] + @read_forum_topic_ids << @topics[4] + end + + context "when the user's last_forum_read_at is null" do + setup do + @user.update_attribute(:last_forum_read_at, nil) + end + + should "return the oldest unread topic" do + @topic.update_last_forum_read_at(@read_forum_topic_ids) + @user.reload + assert_equal(@topics[1].updated_at.to_i, @user.last_forum_read_at.to_i) + end + end + + context "when the user's last_forum_read_at is 2 days from now" do + setup do + @user.update_attribute(:last_forum_read_at, 2.days.from_now) + end + + should "return the oldest unread topic" do + @topic.update_last_forum_read_at(@read_forum_topic_ids) + @user.reload + assert_equal(@topics[3].updated_at.to_i, @user.last_forum_read_at.to_i) + end + end + end + context "#merge" do setup do @topic2 = FactoryGirl.create(:forum_topic, :title => "yyy")