diff --git a/app/controllers/internal/users_controller.rb b/app/controllers/internal/users_controller.rb index fd949ac59..2aed5a635 100644 --- a/app/controllers/internal/users_controller.rb +++ b/app/controllers/internal/users_controller.rb @@ -45,13 +45,9 @@ class Internal::UsersController < Internal::ApplicationController end def banish - @user = User.find(params[:id]) - begin - Moderator::BanishUser.call(admin: current_user, user: @user) - rescue StandardError => e - flash[:danger] = e.message - end - redirect_to "/internal/users/#{@user.id}/edit" + Moderator::BanishUserWorker.perform_async(current_user.id, params[:id].to_i) + flash[:success] = "This user is being banished in the background. The job will complete soon." + redirect_to "/internal/users/#{params[:id]}/edit" end def full_delete diff --git a/app/workers/moderator/banish_user_worker.rb b/app/workers/moderator/banish_user_worker.rb new file mode 100644 index 000000000..358f85716 --- /dev/null +++ b/app/workers/moderator/banish_user_worker.rb @@ -0,0 +1,16 @@ +module Moderator + class BanishUserWorker + include Sidekiq::Worker + + sidekiq_options queue: :high_priority, retry: 10 + + def perform(admin_id, abuser_id) + abuser = User.find(abuser_id) + admin = User.find(admin_id) + Moderator::BanishUser.call(admin: admin, user: abuser) + rescue StandardError => e + DatadogStatsClient.count("moderators.banishuser", 1, tags: ["action:failed", "user_id:#{abuser.id}"]) + Honeybadger.notify(e) + end + end +end diff --git a/spec/requests/internal/users_banish_spec.rb b/spec/requests/internal/users_manage_spec.rb similarity index 85% rename from spec/requests/internal/users_banish_spec.rb rename to spec/requests/internal/users_manage_spec.rb index e5b61f6a3..44561f902 100644 --- a/spec/requests/internal/users_banish_spec.rb +++ b/spec/requests/internal/users_manage_spec.rb @@ -197,64 +197,6 @@ RSpec.describe "Internal::Users", type: :request do end end - context "when banishing user" do - def banish_user - post "/internal/users/#{user.id}/banish" - user.reload - end - - it "reassigns username and removes profile info" do - user.currently_hacking_on = "currently hackin on !!!!!!!!!!!!" - user.save - banish_user - expect(user.currently_hacking_on).to eq("") - expect(user.username).to include("spam_") - end - - it "adds banned role" do - banish_user - expect(user.roles.last.name).to eq("banned") - expect(Note.count).to eq(1) - end - - it "deletes user content" do - banish_user - expect(user.reactions.count).to eq(0) - expect(user.comments.count).to eq(0) - expect(user.articles.count).to eq(0) - end - - it "removes a user's direct chat channels" do - ChatChannel.create_with_users([user, user2]) - - expect { banish_user }.to change(user.chat_channels, :count).from(1).to(0) - end - - it "removes all follow relationships" do - user.follow(user2) - banish_user - expect(user.follows.count).to eq(0) - end - - it "removes a user's classified listings" do - create(:classified_listing, user: user) - banish_user - expect(user.classified_listings.count).to eq(0) - end - - it "creates an entry in the BanishedUsers table" do - expect do - banish_user - end.to change(BanishedUser, :count).by(1) - end - - it "records who banished a user" do - banish_user - admin = BanishedUser.last - expect(admin.banished_by).to eq super_admin - end - end - context "when handling credits" do before do create(:organization_membership, user: super_admin, organization: organization, type_of_user: "admin") diff --git a/spec/requests/internal/users_spec.rb b/spec/requests/internal/users_spec.rb index 5d55733f8..511600eee 100644 --- a/spec/requests/internal/users_spec.rb +++ b/spec/requests/internal/users_spec.rb @@ -41,8 +41,10 @@ RSpec.describe "internal/users", type: :request do describe "POST /internal/users/:id/banish" do it "bans user for spam" do + allow(Moderator::BanishUserWorker).to receive(:perform_async) post "/internal/users/#{user.id}/banish" - expect(user.reload.username).to include("spam") + expect(Moderator::BanishUserWorker).to have_received(:perform_async).with(admin.id, user.id) + expect(request.flash[:success]).to include("This user is being banished in the background") end end diff --git a/spec/workers/moderator/banish_user_worker_spec.rb b/spec/workers/moderator/banish_user_worker_spec.rb new file mode 100644 index 000000000..1756624d4 --- /dev/null +++ b/spec/workers/moderator/banish_user_worker_spec.rb @@ -0,0 +1,47 @@ +require "rails_helper" + +RSpec.describe Moderator::BanishUserWorker, type: :worker do + include_examples "#enqueues_on_correct_queue", "high_priority", 1 + + describe "#perform" do + let(:user) { create(:user, currently_hacking_on: "text is here") } + let(:user2) { create(:user) } + let(:admin) { create(:user, :super_admin) } + + before do + create(:article, user_id: user.id) + create(:article, user_id: user.id) + create(:classified_listing, user: user) + ChatChannel.create_with_users([user, user2]) + user.follow(user2) + described_class.new.perform(admin.id, user.id) + user.reload + end + + it "makes user banned and username spam" do + expect(user.username).to include("spam") + expect(user.has_role?(:banned)).to be true + end + + it "deletes user content" do + expect(user.reactions.count).to eq(0) + expect(user.comments.count).to eq(0) + expect(user.articles.count).to eq(0) + expect(user.chat_channels.count).to eq(0) + expect(user.follows.count).to eq(0) + expect(user.classified_listings.count).to eq(0) + end + + it "reassigns profile info" do + expect(user.currently_hacking_on).to eq("") + end + + it "creates an entry in the BanishedUsers table" do + expect(BanishedUser.all.size).to be 1 + end + + it "records who banished a user" do + expect(BanishedUser.last.banished_by).to eq admin + end + end +end