From 8a0478b97d9799239cf5baaad2e61ae0520a935c Mon Sep 17 00:00:00 2001
From: Joffrey JAFFEUX <j.jaffeux@gmail.com>
Date: Tue, 4 Aug 2020 11:57:33 +0200
Subject: [PATCH] DEV: adds plugin api to add custom recipients of a post
 revision (#10367)

* DEV: adds plugin api to add custom recipients of a post revision

Usage:

```
add_post_revision_notifier_recipients do |post_revision|
  [78]
end
```
---
 app/services/post_action_notifier.rb       | 12 ++++++++++++
 lib/plugin/instance.rb                     |  9 +++++++++
 spec/services/post_action_notifier_spec.rb | 22 ++++++++++++++++++++++
 3 files changed, 43 insertions(+)

diff --git a/app/services/post_action_notifier.rb b/app/services/post_action_notifier.rb
index a49a341eca1..909e26321bf 100644
--- a/app/services/post_action_notifier.rb
+++ b/app/services/post_action_notifier.rb
@@ -114,6 +114,10 @@ class PostActionNotifier
       )
     end
 
+    custom_post_revision_notifier_recipients.each do |block|
+      user_ids.concat(block.call(post_revision))
+    end
+
     if user_ids.present?
       DB.after_commit do
         Jobs.enqueue(:notify_post_revision,
@@ -137,4 +141,12 @@ class PostActionNotifier
       )
     end
   end
+
+  def self.custom_post_revision_notifier_recipients
+    @custom_post_revision_notifier_recipients ||= Set.new
+  end
+
+  def self.add_post_revision_notifier_recipients(&block)
+    custom_post_revision_notifier_recipients << block
+  end
 end
diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb
index fe64f3b21b9..f1de573cc8f 100644
--- a/lib/plugin/instance.rb
+++ b/lib/plugin/instance.rb
@@ -280,6 +280,15 @@ class Plugin::Instance
     end
   end
 
+  # Allows to add additional user_ids to the list of people notified when doing a post revision
+  def add_post_revision_notifier_recipients(&block)
+    reloadable_patch do |plugin|
+      ::PostActionNotifier.add_post_revision_notifier_recipients do |post_revision|
+        plugin.enabled? ? block.call(post_revision) : []
+      end
+    end
+  end
+
   # Applies to all sites in a multisite environment. Ignores plugin.enabled?
   def add_preloaded_group_custom_field(field)
     reloadable_patch do |plugin|
diff --git a/spec/services/post_action_notifier_spec.rb b/spec/services/post_action_notifier_spec.rb
index 7f36af6b2c4..dda44134634 100644
--- a/spec/services/post_action_notifier_spec.rb
+++ b/spec/services/post_action_notifier_spec.rb
@@ -98,6 +98,28 @@ describe PostActionNotifier do
 
     end
 
+    context 'when using plugin API to add custom recipients' do
+      let(:lurker) { Fabricate(:user) }
+
+      before do
+        plugin = Plugin::Instance.new
+        plugin.add_post_revision_notifier_recipients do |post_revision|
+          [lurker.id]
+        end
+      end
+
+      after do
+        DiscoursePluginRegistry.reset!
+      end
+
+      it 'notifies the specified user of the revision' do
+        expect {
+          post.revise(evil_trout, raw: "world is the new body of the message")
+        }.to change {
+          lurker.notifications.count
+        }.by(1)
+      end
+    end
   end
 
   context 'private message' do