Allow admins to delete users without emails (#6530) [deploy]

* Allow admins to delete users without emails

* Guard against blank email addresses
This commit is contained in:
Michael Kohl 2020-03-11 04:20:36 +07:00 committed by GitHub
parent 83a59063fc
commit 02f86fedd7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 42 additions and 5 deletions

View file

@ -58,7 +58,7 @@ class Internal::UsersController < Internal::ApplicationController
@user = User.find(params[:id])
begin
Moderator::DeleteUser.call(admin: current_user, user: @user, user_params: user_params)
flash[:success] = "@" + @user.username + " (email: " + @user.email + ", user_id: " + @user.id.to_s + ") has been fully deleted. If requested, old content may have been ghostified. If this is a GDPR delete, delete them from Mailchimp & Google Analytics."
flash[:success] = "@#{@user.username} (email: #{@user.email.presence || 'no email'}, user_id: #{@user.id}) has been fully deleted. If requested, old content may have been ghostified. If this is a GDPR delete, delete them from Mailchimp & Google Analytics."
rescue StandardError => e
flash[:danger] = e.message
end

View file

@ -463,6 +463,8 @@ class User < ApplicationRecord
end
def unsubscribe_from_newsletters
return if email.blank?
MailchimpBot.new(self).unsubscribe_all_newsletters
end

View file

@ -9,7 +9,9 @@ module Users
return unless user
Users::Delete.call(user)
NotifyMailer.account_deleted_email(user).deliver unless admin_delete
return if admin_delete || user.email.blank?
NotifyMailer.account_deleted_email(user).deliver
rescue StandardError => e
DatadogStatsClient.count("users.delete", 1, tags: ["action:failed", "user_id:#{user.id}"])
Rails.logger.error("Error while deleting user: #{e}")

View file

@ -22,7 +22,7 @@ RSpec.describe "internal/users", type: :request do
end
end
describe "GET internal/users/:id/edit" do
describe "GET /internal/users/:id/edit" do
it "redirects from /username/moderate" do
get "/#{user.username}/moderate"
expect(response).to redirect_to("/internal/users/#{user.id}")
@ -39,14 +39,14 @@ RSpec.describe "internal/users", type: :request do
end
end
describe "POST internal/users/:id/banish" do
describe "POST /internal/users/:id/banish" do
it "bans user for spam" do
post "/internal/users/#{user.id}/banish"
expect(user.reload.username).to include("spam")
end
end
describe "DELETE internal/users/:id/remove_identity" do
describe "DELETE /internal/users/:id/remove_identity" do
it "removes the given identity" do
identity = user.identities.first
delete "/internal/users/#{user.id}/remove_identity", params: { user: { identity_id: identity.id } }

View file

@ -0,0 +1,33 @@
require "rails_helper"
RSpec.describe "Admin deletes user", type: :system do
let(:admin) { create(:user, :super_admin) }
let(:user) { create(:user) }
before do
sign_in admin
visit "/internal/users/#{user.id}/edit"
end
it "enqueues a job for deleting the user" do
sidekiq_assert_enqueued_jobs(1, only: Users::DeleteWorker) do
click_button "☠️ Fully Delete User & All Activity ☠️"
end
message = "@#{user.username} (email: #{user.email}, user_id: #{user.id}) has been fully deleted."
expect(page).to have_content(message)
end
# See: https://github.com/thepracticaldev/tech-private/issues/404
it "deletes users when they have no email address" do
user.update(email: nil)
sidekiq_perform_enqueued_jobs do
click_button "☠️ Fully Delete User & All Activity ☠️"
end
message = "@#{user.username} (email: no email, user_id: #{user.id}) has been fully deleted."
expect(page).to have_content(message)
expect(User.find_by(id: user.id)).to be_nil
end
end