FIX: when unread reply notification exists don't create new (#8921)

* FIX: when unread reply notification exists don't create new

From time to time, the user is creating a reply post and then they want to add additional details. They edit an existing post and for example, add a quote from a previous one.

In that situation, if the user to whom reply was directed to already have the unread notification, we should not create the new one.

That behaviour was mentioned here: https://meta.discourse.org/t/reply-then-edit-to-add-quote-notification-redundancy/138358

* FIX: dont create new notification if already exists
This commit is contained in:
Krzysztof Kotlarek 2020-02-14 16:41:42 +11:00 committed by GitHub
parent 38dd184a16
commit e90f9e5cc4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 5 deletions

View File

@ -261,6 +261,7 @@ class PostAlerter
end
def should_notify_previous?(user, post, notification, opts)
return false unless notification
case notification.notification_type
when Notification.types[:edited] then should_notify_edit?(notification, post, opts)
when Notification.types[:liked] then should_notify_like?(user, notification)
@ -330,7 +331,7 @@ class PostAlerter
# Don't notify the same user about the same type of notification on the same post
existing_notification_of_same_type = existing_notifications.find { |n| n.notification_type == type }
return if existing_notification_of_same_type && !should_notify_previous?(user, post, existing_notification_of_same_type, opts)
return if existing_notifications.present? && !should_notify_previous?(user, post, existing_notification_of_same_type, opts)
notification_data = {}

View File

@ -165,9 +165,11 @@ describe PostAlerter do
end
context 'quotes' do
let(:category) { Fabricate(:category) }
let(:topic) { Fabricate(:topic, category: category) }
it 'does not notify for muted users' do
post = Fabricate(:post, raw: '[quote="EvilTrout, post:1"]whatup[/quote]')
post = Fabricate(:post, raw: '[quote="EvilTrout, post:1"]whatup[/quote]', topic: topic)
MutedUser.create!(user_id: evil_trout.id, muted_user_id: post.user_id)
expect {
@ -176,7 +178,7 @@ describe PostAlerter do
end
it 'does not notify for ignored users' do
post = Fabricate(:post, raw: '[quote="EvilTrout, post:1"]whatup[/quote]')
post = Fabricate(:post, raw: '[quote="EvilTrout, post:1"]whatup[/quote]', topic: topic)
IgnoredUser.create!(user_id: evil_trout.id, ignored_user_id: post.user_id)
expect {
@ -184,9 +186,27 @@ describe PostAlerter do
}.to change(evil_trout.notifications, :count).by(0)
end
it 'does not collapse quote notifications' do
topic = Fabricate(:topic)
it 'does not notify for users with new reply notification' do
post = Fabricate(:post, raw: '[quote="EvilTrout, post:1"]whatup[/quote]', topic: topic)
notification = Notification.create!(topic: post.topic,
post_number: post.post_number,
read: false,
notification_type: Notification.types[:replied],
user: evil_trout,
data: { topic_title: "test topic" }.to_json
)
expect {
PostAlerter.post_created(post)
}.to change(evil_trout.notifications, :count).by(0)
notification.destroy
expect {
PostAlerter.post_created(post)
}.to change(evil_trout.notifications, :count).by(1)
end
it 'does not collapse quote notifications' do
expect {
2.times do
create_post_with_alerts(