From b43cb38d4027068570cba4193c0f38e96e1aba9e Mon Sep 17 00:00:00 2001 From: Anna Buianova Date: Wed, 7 Feb 2024 20:36:19 +0300 Subject: [PATCH] Remove notifications related to spammer actions (after the role is assigned) (#20593) --- .../moderator/manage_activity_and_roles.rb | 5 ++++ .../notifications/remove_by_spammer.rb | 25 +++++++++++++++++++ .../notifications/remove_by_spammer_worker.rb | 14 +++++++++++ .../manage_activity_and_roles_spec.rb | 23 +++++++++++++++++ .../remove_by_spammer_worker_spec.rb | 24 ++++++++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 app/services/notifications/remove_by_spammer.rb create mode 100644 app/workers/notifications/remove_by_spammer_worker.rb create mode 100644 spec/workers/notifications/remove_by_spammer_worker_spec.rb diff --git a/app/services/moderator/manage_activity_and_roles.rb b/app/services/moderator/manage_activity_and_roles.rb index c28943ab0..f94142e15 100644 --- a/app/services/moderator/manage_activity_and_roles.rb +++ b/app/services/moderator/manage_activity_and_roles.rb @@ -33,6 +33,10 @@ module Moderator remove_tag_moderator_role end + def remove_notifications + Notifications::RemoveBySpammerWorker.perform_async(user.id) + end + def remove_mod_roles @user.remove_role(:trusted) @user.remove_role(:tag_moderator) @@ -73,6 +77,7 @@ module Moderator when "Spam" user.add_role(:spam) remove_privileges + remove_notifications when "Super Moderator" assign_elevated_role_to_user(user, :super_moderator) TagModerators::AddTrustedRole.call(user) diff --git a/app/services/notifications/remove_by_spammer.rb b/app/services/notifications/remove_by_spammer.rb new file mode 100644 index 000000000..890d69e00 --- /dev/null +++ b/app/services/notifications/remove_by_spammer.rb @@ -0,0 +1,25 @@ +# remove notifications created for spammer actions: +# follow user, create comments, create articles +module Notifications + class RemoveBySpammer + def self.call(...) + new(...).call + end + + def initialize(user) + @user = user + end + + def call + return unless user + + Notification.where(notifiable_type: "Follow", notifiable_id: user.follow_ids).delete_all + Notification.where(notifiable_type: "Comment", notifiable_id: user.comment_ids).delete_all + Notification.where(notifiable_type: "Article", action: "Published", notifiable_id: user.article_ids).delete_all + end + + private + + attr_reader :user + end +end diff --git a/app/workers/notifications/remove_by_spammer_worker.rb b/app/workers/notifications/remove_by_spammer_worker.rb new file mode 100644 index 000000000..c173ca3fd --- /dev/null +++ b/app/workers/notifications/remove_by_spammer_worker.rb @@ -0,0 +1,14 @@ +module Notifications + class RemoveBySpammerWorker + include Sidekiq::Job + + sidekiq_options queue: :low_priority, retry: 10 + + def perform(user_id) + user = User.find_by(id: user_id) + return unless user + + Notifications::RemoveBySpammer.call(user) + end + end +end diff --git a/spec/services/moderator/manage_activity_and_roles_spec.rb b/spec/services/moderator/manage_activity_and_roles_spec.rb index afa97ec14..f5ed5c18a 100644 --- a/spec/services/moderator/manage_activity_and_roles_spec.rb +++ b/spec/services/moderator/manage_activity_and_roles_spec.rb @@ -250,6 +250,29 @@ RSpec.describe Moderator::ManageActivityAndRoles, type: :service do end end + describe "removes notifications when adding the spam role" do + let(:nice_article) { create(:article, user: user) } + let(:spam_user) { create(:user) } + let(:spam_article) { create(:article, user: spam_user) } + let(:spam_follow) { create(:follow, follower: spam_user, followable: user) } + let(:spam_comment) { create(:comment, user: spam_user, commentable: nice_article) } + + before do + create(:notification, notifiable: spam_comment, user: user) + create(:notification, notifiable: spam_article, action: "Published", user: user) + create(:notification, notifiable: spam_follow, user: user) + end + + it "removes notifications related to the spammer" do + expect(Notification.count).to eq(3) + expect do + sidekiq_perform_enqueued_jobs do + manage_roles_for(spam_user, user_status: "Spam") + end + end.to change(Notification, :count).by(-3) + end + end + context "when not super admin" do before do admin.remove_role(:super_admin) diff --git a/spec/workers/notifications/remove_by_spammer_worker_spec.rb b/spec/workers/notifications/remove_by_spammer_worker_spec.rb new file mode 100644 index 000000000..5a74ea9f3 --- /dev/null +++ b/spec/workers/notifications/remove_by_spammer_worker_spec.rb @@ -0,0 +1,24 @@ +require "rails_helper" + +RSpec.describe Notifications::RemoveBySpammerWorker, type: :woker do + include_examples "#enqueues_on_correct_queue", "low_priority", 1 + + describe "#perform" do + let(:worker) { subject } + let(:user) { create(:user) } + + before do + allow(Notifications::RemoveBySpammer).to receive(:call) + end + + it "calls the service" do + worker.perform(user.id) + expect(Notifications::RemoveBySpammer).to have_received(:call).with(user) + end + + it "doesn't call the service with a non-existent user" do + worker.perform(-10) + expect(Notifications::RemoveBySpammer).not_to have_received(:call) + end + end +end