From 89eca87f167bd20e670bf3c7dbaa090a52b40eb3 Mon Sep 17 00:00:00 2001
From: Arpit Jalan <arpit@techapj.com>
Date: Fri, 1 Jun 2018 19:42:31 +0530
Subject: [PATCH] FEATURE: add staff action log for post rejections

---
 app/models/queued_post.rb                 |  1 +
 app/models/user_history.rb                |  2 ++
 app/services/staff_action_logger.rb       | 22 ++++++++++++++++++++++
 config/locales/client.en.yml              |  1 +
 spec/models/queued_post_spec.rb           |  3 +++
 spec/services/staff_action_logger_spec.rb | 18 ++++++++++++++++++
 6 files changed, 47 insertions(+)

diff --git a/app/models/queued_post.rb b/app/models/queued_post.rb
index b91d3af3de2..fb4a390f7fc 100644
--- a/app/models/queued_post.rb
+++ b/app/models/queued_post.rb
@@ -47,6 +47,7 @@ class QueuedPost < ActiveRecord::Base
 
   def reject!(rejected_by)
     change_to!(:rejected, rejected_by)
+    StaffActionLogger.new(rejected_by).log_post_rejected(self)
     DiscourseEvent.trigger(:rejected_post, self)
   end
 
diff --git a/app/models/user_history.rb b/app/models/user_history.rb
index f500d831793..c02e73f9aff 100644
--- a/app/models/user_history.rb
+++ b/app/models/user_history.rb
@@ -80,6 +80,7 @@ class UserHistory < ActiveRecord::Base
       removed_suspend_user: 61,
       removed_unsilence_user: 62,
       removed_unsuspend_user: 63,
+      post_rejected: 64
     )
   end
 
@@ -138,6 +139,7 @@ class UserHistory < ActiveRecord::Base
       :create_badge,
       :change_badge,
       :delete_badge,
+      :post_rejected
     ]
   end
 
diff --git a/app/services/staff_action_logger.rb b/app/services/staff_action_logger.rb
index 07a47a4c48d..38c1b905987 100644
--- a/app/services/staff_action_logger.rb
+++ b/app/services/staff_action_logger.rb
@@ -526,6 +526,28 @@ class StaffActionLogger
     ))
   end
 
+  def log_post_rejected(rejected_post, opts = {})
+    raise Discourse::InvalidParameters.new(:rejected_post) unless rejected_post && rejected_post.is_a?(QueuedPost)
+
+    topic = rejected_post.topic || Topic.with_deleted.find_by(id: rejected_post.topic_id)
+    topic_title = topic&.title || "not found"
+    username = rejected_post.user&.username || "unknown"
+    name = rejected_post.user&.name || "unknown"
+
+    details = [
+      "created_at: #{rejected_post.created_at}",
+      "rejected_at: #{rejected_post.rejected_at}",
+      "user: #{username} (#{name})",
+      "topic: #{topic_title}",
+      "raw: #{rejected_post.raw}",
+    ]
+
+    UserHistory.create!(params(opts).merge(
+      action: UserHistory.actions[:post_rejected],
+      details: details.join("\n")
+    ))
+  end
+
   private
 
     def params(opts = nil)
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index e433e46f120..a1713ce3160 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -3406,6 +3406,7 @@ en:
             disabled_second_factor: "disable Two Factor Authentication"
             topic_published: "topic published"
             post_approved: "post approved"
+            post_rejected: "post rejected"
             create_badge: "create badge"
             change_badge: "change badge"
             delete_badge: "delete badge"
diff --git a/spec/models/queued_post_spec.rb b/spec/models/queued_post_spec.rb
index b6e5113efe2..22e7331d833 100644
--- a/spec/models/queued_post_spec.rb
+++ b/spec/models/queued_post_spec.rb
@@ -86,6 +86,9 @@ describe QueuedPost do
       # It removes the pending action
       expect(UserAction.where(queued_post_id: qp.id).count).to eq(0)
 
+      # Logs staff action log for rejected post
+      expect(UserHistory.where(action: UserHistory.actions[:post_rejected]).count).to eq(1)
+
       # We can't reject twice
       expect(-> { qp.reject!(admin) }).to raise_error(QueuedPost::InvalidStateTransition)
     end
diff --git a/spec/services/staff_action_logger_spec.rb b/spec/services/staff_action_logger_spec.rb
index 70132a7a51e..bc72628558d 100644
--- a/spec/services/staff_action_logger_spec.rb
+++ b/spec/services/staff_action_logger_spec.rb
@@ -488,4 +488,22 @@ describe StaffActionLogger do
       expect { log_post_approved }.to change { UserHistory.count }.by(1)
     end
   end
+
+  describe 'log_post_rejected' do
+    let(:rejected_post) { Fabricate(:queued_post) }
+
+    subject(:log_post_rejected) { described_class.new(admin).log_post_rejected(rejected_post) }
+
+    it 'raises an error when post is nil' do
+      expect { logger.log_post_rejected(nil) }.to raise_error(Discourse::InvalidParameters)
+    end
+
+    it 'raises an error when post is not a QueuedPosts' do
+      expect { logger.log_post_rejected(1) }.to raise_error(Discourse::InvalidParameters)
+    end
+
+    it 'creates a new UserHistory record' do
+      expect { log_post_rejected }.to change { UserHistory.count }.by(1)
+    end
+  end
 end