mirror of
https://github.com/discourse/discourse.git
synced 2025-03-06 03:09:43 +00:00
FIX: Notify group members when someone quotes or replies to their post. (#15295)
When a member set a group PM notification level to Normal, we didn't notify group members if someone quoted or replied to one of their posts.
This commit is contained in:
parent
666d291b24
commit
0719531bd3
@ -157,7 +157,7 @@ class PostAlerter
|
|||||||
# private messages
|
# private messages
|
||||||
if new_record
|
if new_record
|
||||||
if post.topic.private_message?
|
if post.topic.private_message?
|
||||||
notify_pm_users(post, reply_to_user, notified)
|
notify_pm_users(post, reply_to_user, quoted_users, notified)
|
||||||
elsif notify_about_reply?(post)
|
elsif notify_about_reply?(post)
|
||||||
notify_post_users(post, notified, new_record: new_record)
|
notify_post_users(post, notified, new_record: new_record)
|
||||||
end
|
end
|
||||||
@ -582,9 +582,9 @@ class PostAlerter
|
|||||||
# TODO: Move to post-analyzer?
|
# TODO: Move to post-analyzer?
|
||||||
# Returns a list of users who were quoted in the post
|
# Returns a list of users who were quoted in the post
|
||||||
def extract_quoted_users(post)
|
def extract_quoted_users(post)
|
||||||
post.raw.scan(/\[quote=\"([^,]+),.+\"\]/).uniq.map do |m|
|
usernames = post.raw.scan(/\[quote=\"([^,]+),.+\"\]/).uniq.map { |q| q.first.strip.downcase }
|
||||||
User.find_by("username_lower = :username AND id != :id", username: m.first.strip.downcase, id: post.user_id)
|
|
||||||
end.compact
|
User.where.not(id: post.user_id).where(username_lower: usernames)
|
||||||
end
|
end
|
||||||
|
|
||||||
def extract_linked_users(post)
|
def extract_linked_users(post)
|
||||||
@ -622,7 +622,7 @@ class PostAlerter
|
|||||||
users
|
users
|
||||||
end
|
end
|
||||||
|
|
||||||
def notify_pm_users(post, reply_to_user, notified)
|
def notify_pm_users(post, reply_to_user, quoted_users, notified)
|
||||||
return unless post.topic
|
return unless post.topic
|
||||||
|
|
||||||
warn_if_not_sidekiq
|
warn_if_not_sidekiq
|
||||||
@ -653,10 +653,17 @@ class PostAlerter
|
|||||||
users.each do |user|
|
users.each do |user|
|
||||||
case TopicUser.get(post.topic, user)&.notification_level
|
case TopicUser.get(post.topic, user)&.notification_level
|
||||||
when TopicUser.notification_levels[:watching]
|
when TopicUser.notification_levels[:watching]
|
||||||
# only create a notification when watching the group
|
create_pm_notification(user, post, emails_to_skip_send)
|
||||||
create_notification(user, Notification.types[:private_message], post, skip_send_email_to: emails_to_skip_send)
|
|
||||||
when TopicUser.notification_levels[:tracking]
|
when TopicUser.notification_levels[:tracking]
|
||||||
notify_group_summary(user, post)
|
if is_replying?(user, reply_to_user, quoted_users)
|
||||||
|
create_pm_notification(user, post, emails_to_skip_send)
|
||||||
|
else
|
||||||
|
notify_group_summary(user, post)
|
||||||
|
end
|
||||||
|
when TopicUser.notification_levels[:regular]
|
||||||
|
if is_replying?(user, reply_to_user, quoted_users)
|
||||||
|
create_pm_notification(user, post, emails_to_skip_send)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -842,4 +849,12 @@ class PostAlerter
|
|||||||
User.where(id: user_ids_batch).includes(:do_not_disturb_timings).each { |user| yield(user) }
|
User.where(id: user_ids_batch).includes(:do_not_disturb_timings).each { |user| yield(user) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_pm_notification(user, post, emails_to_skip_send)
|
||||||
|
create_notification(user, Notification.types[:private_message], post, skip_send_email_to: emails_to_skip_send)
|
||||||
|
end
|
||||||
|
|
||||||
|
def is_replying?(user, reply_to_user, quoted_users)
|
||||||
|
reply_to_user == user || quoted_users.include?(user)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -125,6 +125,69 @@ describe PostAlerter do
|
|||||||
expect(message_data.dig(:last_notification, :notification, :data, :inbox_count)).to eq(starting_count + 1)
|
expect(message_data.dig(:last_notification, :notification, :data, :inbox_count)).to eq(starting_count + 1)
|
||||||
expect(message_data[:unread_notifications]).to eq(1)
|
expect(message_data[:unread_notifications]).to eq(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'sends a PM notification when replying to a member tracking the topic' do
|
||||||
|
group.add(user1)
|
||||||
|
|
||||||
|
post = Fabricate(:post, topic: pm, user: user1)
|
||||||
|
TopicUser.change(user1.id, pm.id, notification_level: TopicUser.notification_levels[:tracking])
|
||||||
|
|
||||||
|
expect {
|
||||||
|
create_post_with_alerts(
|
||||||
|
raw: 'this is a reply to your post...', topic: pm, user: user2,
|
||||||
|
reply_to_post_number: post.post_number
|
||||||
|
)
|
||||||
|
}.to change(
|
||||||
|
user1.notifications.where(notification_type: Notification.types[:private_message]),
|
||||||
|
:count
|
||||||
|
).by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'notifies a group member if someone replies to their post' do
|
||||||
|
group.add(user1)
|
||||||
|
|
||||||
|
post = Fabricate(:post, topic: pm, user: user1)
|
||||||
|
TopicUser.change(user1.id, pm.id, notification_level: TopicUser.notification_levels[:regular])
|
||||||
|
|
||||||
|
expect {
|
||||||
|
create_post_with_alerts(
|
||||||
|
raw: 'this is a reply to your post...', topic: pm, user: user2,
|
||||||
|
reply_to_post_number: post.post_number
|
||||||
|
)
|
||||||
|
}.to change(user1.notifications, :count).by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'nofies a group member if someone quotes their post' do
|
||||||
|
group.add(user1)
|
||||||
|
|
||||||
|
post = Fabricate(:post, topic: pm, user: user1)
|
||||||
|
TopicUser.change(user1.id, pm.id, notification_level: TopicUser.notification_levels[:regular])
|
||||||
|
quote_raw = <<~STRING
|
||||||
|
[quote="#{user1.username}, post:1, topic:#{pm.id}"]#{post.raw}[/quote]
|
||||||
|
STRING
|
||||||
|
|
||||||
|
expect {
|
||||||
|
create_post_with_alerts(
|
||||||
|
raw: quote_raw, topic: pm, user: user2,
|
||||||
|
)
|
||||||
|
}.to change(user1.notifications, :count).by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "Doesn't notify non-admin users when their post is quoted inside a whisper" do
|
||||||
|
admin = Fabricate(:admin)
|
||||||
|
group.add(admin)
|
||||||
|
|
||||||
|
TopicUser.change(user2.id, pm.id, notification_level: TopicUser.notification_levels[:regular])
|
||||||
|
quote_raw = <<~STRING
|
||||||
|
[quote="#{user2.username}, post:1, topic:#{pm.id}"]#{op.raw}[/quote]
|
||||||
|
STRING
|
||||||
|
|
||||||
|
expect {
|
||||||
|
create_post_with_alerts(
|
||||||
|
raw: quote_raw, topic: pm, user: admin, post_type: Post.types[:whisper]
|
||||||
|
)
|
||||||
|
}.to change(user2.notifications, :count).by(0)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user