From c89b2ad8096df63d2b3d4a49fde73d258221588b Mon Sep 17 00:00:00 2001
From: Benjamin Neff <benjamin@coding4coffee.ch>
Date: Wed, 21 Feb 2018 03:03:52 +0100
Subject: [PATCH] Prevent duplicate mention notifications when the post is
 received twice

closes #7721
---
 Changelog.md                                |  1 +
 app/models/notifications/mentioned.rb       |  5 ++++-
 spec/models/notifications/mentioned_spec.rb | 12 ++++++++++++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/Changelog.md b/Changelog.md
index 40a66b6630..9c9c0daf5d 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -5,6 +5,7 @@
 * Make script/server work on readonly filesystems [#7719](https://github.com/diaspora/diaspora/pull/7719)
 
 ## Bug fixes
+* Prevent duplicate mention notifications when the post is received twice [#7721](https://github.com/diaspora/diaspora/pull/7721)
 
 ## Features
 * Add basic html5 audio/video embedding support [#6418](https://github.com/diaspora/diaspora/pull/6418)
diff --git a/app/models/notifications/mentioned.rb b/app/models/notifications/mentioned.rb
index d49b384d76..732cbb41e9 100644
--- a/app/models/notifications/mentioned.rb
+++ b/app/models/notifications/mentioned.rb
@@ -18,7 +18,10 @@ module Notifications
         )
 
         relevant_mentions.each do |mention|
-          create_notification(mention.person.owner, mention, actor).try(:email_the_user, mention, actor)
+          recipient = mention.person.owner
+          unless exists?(recipient: recipient, target: mention)
+            create_notification(recipient, mention, actor).try(:email_the_user, mention, actor)
+          end
         end
       end
     end
diff --git a/spec/models/notifications/mentioned_spec.rb b/spec/models/notifications/mentioned_spec.rb
index 90e112aa33..ca77f960fb 100644
--- a/spec/models/notifications/mentioned_spec.rb
+++ b/spec/models/notifications/mentioned_spec.rb
@@ -51,5 +51,17 @@ describe Notifications::Mentioned do
       expect(TestNotification).not_to receive(:create_notification)
       TestNotification.notify(status_message, nil)
     end
+
+    it "doesn't create notification if it already exists" do
+      status_message = FactoryGirl.create(:status_message, text: text_mentioning(alice), author: eve.person)
+      TestNotification.create(
+        recipient: alice,
+        target:    Mention.where(mentions_container: status_message, person: alice.person_id).first,
+        actors:    [status_message.author]
+      )
+
+      expect(TestNotification).not_to receive(:create_notification)
+      TestNotification.notify(status_message, nil)
+    end
   end
 end
-- 
GitLab