FIX: new pm notification should take precedence over mention (#19391)

When a new private message is created with mention inside, notification about private message should take precedence over mention notification.

https://meta.discourse.org/t/notification-badge-for-pm-mentioning-you/232950
This commit is contained in:
Krzysztof Kotlarek 2022-12-09 12:23:11 +11:00 committed by GitHub
parent dabe7b6ea0
commit f449113c8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 4 deletions

View File

@ -126,6 +126,7 @@ class PostAlerter
if mentioned_users
mentioned_users = only_allowed_users(mentioned_users, post)
mentioned_users = mentioned_users - pm_watching_users(post)
notified += notify_users(mentioned_users - notified, :mentioned, post, mentioned_opts)
end
@ -642,6 +643,14 @@ class PostAlerter
users
end
def pm_watching_users(post)
return [] if !post.topic.private_message?
directly_targeted_users(post).filter do |u|
notification_level = TopicUser.get(post.topic, u)&.notification_level
notification_level == TopicUser.notification_levels[:watching]
end
end
def notify_pm_users(post, reply_to_user, quoted_users, notified)
return [] unless post.topic
@ -660,8 +669,7 @@ class PostAlerter
users = directly_targeted_users(post).reject { |u| notified.include?(u) }
DiscourseEvent.trigger(:before_create_notifications_for_users, users, post)
users.each do |user|
notification_level = TopicUser.get(post.topic, user)&.notification_level
if reply_to_user == user || notification_level == TopicUser.notification_levels[:watching] || user.staged?
if reply_to_user == user || pm_watching_users(post).include?(user) || user.staged?
create_notification(user, Notification.types[:private_message], post, skip_send_email_to: emails_to_skip_send)
end
end

View File

@ -83,6 +83,17 @@ RSpec.describe PostAlerter do
end
it "notifies about private message even if direct mention" do
pm = Fabricate(:topic, archetype: 'private_message', category_id: nil)
op = Fabricate(:post, topic: pm, user: pm.user, raw: "Hello @#{user.username}, nice to meet you")
pm.allowed_users << pm.user
pm.allowed_users << user
TopicUser.create!(user_id: user.id, topic_id: pm.id, notification_level: TopicUser.notification_levels[:watching])
PostAlerter.post_created(op)
expect(Notification.where(user_id: user.id).pluck_first(:notification_type)).to eq(Notification.types[:private_message])
end
context "with group inboxes" do
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
@ -758,15 +769,18 @@ RSpec.describe PostAlerter do
before do
set_topic_notification_level(alice, pm_topic, notification_level)
end
let(:expected_notification) {
notification_level == :watching ? :private_message : :mentioned
}
it "notifies about @username mention" do
args = { user: bob, topic: pm_topic, raw: 'Hello @alice' }
expect { create_post_with_alerts(args) }.to add_notification(alice, :mentioned)
expect { create_post_with_alerts(args) }.to add_notification(alice, expected_notification)
end
it "notifies about @username mentions by non-human users" do
args = { user: Discourse.system_user, topic: pm_topic, raw: 'Hello @alice' }
expect { create_post_with_alerts(args) }.to add_notification(alice, :mentioned)
expect { create_post_with_alerts(args) }.to add_notification(alice, expected_notification)
end
it "notifies about @group mention when allowed user is part of group" do