diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index c0dc02d05..081047b89 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -151,7 +151,6 @@ module Admin end end Credits::Manage.call(@user, credit_params) - add_note if user_params[:new_note] end def export_data @@ -195,10 +194,12 @@ module Admin def unpublish_all_articles target_user = User.find(params[:id].to_i) Moderator::UnpublishAllArticlesWorker.perform_async(target_user.id, current_user.id, "moderator") - if params[:note] && params[:note][:content] - Note.create(noteable: target_user, reason: "unpublish_all_articles", - content: params[:note][:content], author: current_user) - end + + note_content = params.dig(:note, :content).presence + note_content ||= "#{current_user.username} unpublished all articles" + Note.create(noteable: target_user, reason: "unpublish_all_articles", + content: note_content, author: current_user) + message = I18n.t("admin.users_controller.unpublished") respond_to do |format| format.html do diff --git a/app/controllers/articles_controller.rb b/app/controllers/articles_controller.rb index 9834c6734..14059fb15 100644 --- a/app/controllers/articles_controller.rb +++ b/app/controllers/articles_controller.rb @@ -215,6 +215,14 @@ class ArticlesController < ApplicationController result = Articles::Unpublish.call(current_user, @article) if result.success + Audit::Logger.log(:moderator, current_user, params.dup) + Note.create( + noteable: @article.user, + reason: "unpublish_article", + content: "#{current_user.username} unpublished post with ID #{@article.id}", + author: current_user, + ) + render json: { message: "success", path: @article.current_state_path }, status: :ok else render json: { message: @article.errors.full_messages }, status: :unprocessable_entity diff --git a/app/javascript/packs/toggleUserSuspensionModal.js b/app/javascript/packs/toggleUserSuspensionModal.js index 20232d28c..fff66ce51 100644 --- a/app/javascript/packs/toggleUserSuspensionModal.js +++ b/app/javascript/packs/toggleUserSuspensionModal.js @@ -10,7 +10,7 @@ const suspendOrUnsuspendUser = async ({ btnAction, userId, username, - suspendOrUnsuspendReason, + actionReason, }) => { event.preventDefault(); closeModal(); @@ -23,7 +23,7 @@ const suspendOrUnsuspendUser = async ({ body: JSON.stringify({ id: userId, user: { - note_for_current_role: suspendOrUnsuspendReason, + note_for_current_role: actionReason, user_status: btnAction == 'suspend' ? 'Suspended' : 'Good standing', }, }), diff --git a/app/services/moderator/manage_activity_and_roles.rb b/app/services/moderator/manage_activity_and_roles.rb index 2375ebfaf..fd5d155d6 100644 --- a/app/services/moderator/manage_activity_and_roles.rb +++ b/app/services/moderator/manage_activity_and_roles.rb @@ -54,7 +54,7 @@ module Moderator noteable_id: @user.id, noteable_type: "User", reason: reason, - content: content, + content: content || "#{@admin.username} updated #{@user.username}", ) end diff --git a/spec/requests/admin/users_spec.rb b/spec/requests/admin/users_spec.rb index f85fe7a08..f0ad26fa5 100644 --- a/spec/requests/admin/users_spec.rb +++ b/spec/requests/admin/users_spec.rb @@ -313,12 +313,6 @@ RSpec.describe "/admin/member_manager/users", type: :request do expect(note.author_id).to eq(admin.id) end - it "doesn't create a note if note content was not passed" do - expect do - post unpublish_all_articles_admin_user_path(target_user.id, note: { content: "" }) - end.not_to change(Note, :count) - end - it "unpublishes all articles" do allow(Moderator::UnpublishAllArticlesWorker).to receive(:perform_async) post unpublish_all_articles_admin_user_path(target_user.id) diff --git a/spec/requests/moderations_spec.rb b/spec/requests/moderations_spec.rb index 308343c1b..2eafd385c 100644 --- a/spec/requests/moderations_spec.rb +++ b/spec/requests/moderations_spec.rb @@ -172,4 +172,87 @@ RSpec.describe "Moderations", type: :request do end end end + + describe "Super moderator Note & AuditLog" do + let(:super_mod) { create(:user, :super_moderator) } + + before do + sign_in super_mod + Audit::Subscribe.listen(:moderator) + end + + after { Audit::Subscribe.forget(:moderator) } + + context "when unpublish a post of user" do + it "creates a note on a user" do + expected_note = "#{super_mod.username} unpublished post with ID #{article.id}" + expect do + patch "/articles/#{article.id}/admin_unpublish", + params: { slug: article.slug, username: article.user.username } + end.to change(Note, :count).by(1) + expect(Note.last.content).to eq(expected_note) + end + + it "creates an AuditLog for the action taken" do + expect do + patch "/articles/#{article.id}/admin_unpublish", + params: { slug: article.slug, username: article.user.username } + end.to change(AuditLog, :count).by(1) + end + end + + context "when unpublish all posts of user" do + it "creates a note on a user when note content is provided" do + note_content = "Unpublish due to Spam" + expect do + post "/admin/member_manager/users/#{article.user_id}/unpublish_all_articles", + params: { note: { content: note_content } } + end.to change(Note, :count).by(1) + expect(Note.last.content).to eq(note_content) + end + + it "creates a default note on a user when note content isn't provided" do + expected_note = "#{super_mod.username} unpublished all articles" + expect do + post "/admin/member_manager/users/#{article.user_id}/unpublish_all_articles" + end.to change(Note, :count).by(1) + expect(Note.last.content).to eq(expected_note) + end + + it "creates an AuditLog for the action taken" do + expect do + post "/admin/member_manager/users/#{article.user_id}/unpublish_all_articles", + params: { note: { content: "Test note" } } + sidekiq_perform_enqueued_jobs + end.to change(AuditLog, :count).by(1) + end + end + + context "when suspend user" do + it "creates a note on a user when note content is provided" do + note_content = "Unpublish due to Spam" + expect do + patch "/admin/member_manager/users/#{article.user_id}/user_status", + params: { user: { user_status: "Suspend", note_for_current_role: note_content } } + end.to change(Note, :count).by(1) + expect(Note.last.content).to eq(note_content) + end + + it "creates a default note on a user when note content isn't provided" do + expected_note = "#{super_mod.username} updated #{article.user.username}" + expect do + patch "/admin/member_manager/users/#{article.user_id}/user_status", + params: { user: { user_status: "Suspend" } } + end.to change(Note, :count).by(1) + expect(Note.last.content).to eq(expected_note) + end + + it "creates an AuditLog for the action taken" do + expect do + patch "/admin/member_manager/users/#{article.user_id}/user_status", + params: { user: { user_status: "Suspend", new_note: "Test note" } } + end.to change(AuditLog, :count).by(1) + end + end + end end