Skip to content

Commit c58dad6

Browse files
committed
Automatically mark own messages as read
As the sender already read his own message when writing
1 parent 277dd3d commit c58dad6

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

app/services/message_activity_builder.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ def initialize(message)
88
def process!
99
ActiveRecord::Base.transaction do
1010
auto_star_topic_for_sender
11+
mark_message_read_for_sender
1112
fan_out_to_starring_users
1213
end
1314
end
@@ -23,6 +24,24 @@ def auto_star_topic_for_sender
2324
# Race condition - another process already created the star
2425
end
2526

27+
def mark_message_read_for_sender
28+
sender_user = @message.sender.user
29+
return unless sender_user
30+
31+
MessageReadRange.add_range(
32+
user: sender_user,
33+
topic: @message.topic,
34+
start_id: @message.id,
35+
end_id: @message.id
36+
)
37+
38+
ThreadAwareness.mark_until(
39+
user: sender_user,
40+
topic: @message.topic,
41+
until_message_id: @message.id
42+
)
43+
end
44+
2645
def fan_out_to_starring_users
2746
starring_user_ids = @message.topic.topic_stars.pluck(:user_id)
2847
return if starring_user_ids.empty?

spec/services/message_activity_builder_spec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,50 @@
5555
end
5656
end
5757

58+
context "marking message as read for sender" do
59+
it "marks the message as read for registered user sender" do
60+
builder.process!
61+
62+
expect(MessageReadRange.covering?(user: sender_user, topic: topic, message_id: message.id)).to be true
63+
end
64+
65+
it "marks thread awareness for registered user sender" do
66+
builder.process!
67+
68+
expect(ThreadAwareness.covering?(user: sender_user, topic: topic, message_id: message.id)).to be true
69+
end
70+
71+
it "does not mark message as read for guest sender" do
72+
guest_alias = create(:alias, user: nil)
73+
guest_message = create(:message, topic: topic, sender: guest_alias)
74+
guest_builder = described_class.new(guest_message)
75+
76+
expect {
77+
guest_builder.process!
78+
}.not_to change { MessageReadRange.count }
79+
end
80+
81+
it "does not mark thread awareness for guest sender" do
82+
guest_alias = create(:alias, user: nil)
83+
guest_message = create(:message, topic: topic, sender: guest_alias)
84+
guest_builder = described_class.new(guest_message)
85+
86+
expect {
87+
guest_builder.process!
88+
}.not_to change { ThreadAwareness.count }
89+
end
90+
91+
it "extends existing thread awareness" do
92+
# Create initial awareness
93+
ThreadAwareness.mark_until(user: sender_user, topic: topic, until_message_id: message.id - 10)
94+
95+
builder.process!
96+
97+
awareness = ThreadAwareness.find_by(user: sender_user, topic: topic)
98+
expect(awareness.aware_until_message_id).to eq(message.id)
99+
end
100+
end
101+
58102
context "activity creation" do
59103
let(:starring_user1) { create(:user) }
60104
let(:starring_user2) { create(:user) }

0 commit comments

Comments
 (0)