From f6a7a42acc56add133195eed218f8a45002caf1f Mon Sep 17 00:00:00 2001 From: Anna Buianova Date: Fri, 2 Oct 2020 17:12:12 +0300 Subject: [PATCH] Slack notification with reminder to delete user gdpr data (#10532) --- app/services/slack/messengers/user_deleted.rb | 39 +++++++++++++++++++ app/workers/users/delete_worker.rb | 3 ++ .../slack/messengers/user_deleted_spec.rb | 37 ++++++++++++++++++ spec/workers/users/delete_worker_spec.rb | 14 +++++++ 4 files changed, 93 insertions(+) create mode 100644 app/services/slack/messengers/user_deleted.rb create mode 100644 spec/services/slack/messengers/user_deleted_spec.rb diff --git a/app/services/slack/messengers/user_deleted.rb b/app/services/slack/messengers/user_deleted.rb new file mode 100644 index 000000000..97e464581 --- /dev/null +++ b/app/services/slack/messengers/user_deleted.rb @@ -0,0 +1,39 @@ +module Slack + module Messengers + class UserDeleted + MESSAGE_TEMPLATE = <<~TEXT.chomp.freeze + %s (%s) + self-deleted their account. + Please, delete them from Mailchimp & Google Analytics. + TEXT + + def initialize(name:, user_url:) + @name = name + @user_url = user_url + end + + def self.call(*args) + new(*args).call + end + + def call + message = format( + MESSAGE_TEMPLATE, + name: name, + user_url: user_url, + ) + + Slack::Messengers::Worker.perform_async( + message: message, + channel: "user-deleted", + username: "user_deleted_bot", + icon_emoji: ":scissors:", + ) + end + + private + + attr_reader :name, :user_url + end + end +end diff --git a/app/workers/users/delete_worker.rb b/app/workers/users/delete_worker.rb index 19c1ff939..9263c66f6 100644 --- a/app/workers/users/delete_worker.rb +++ b/app/workers/users/delete_worker.rb @@ -15,6 +15,9 @@ module Users # thus we pass the data we need to render to deliver the email, not the # whole object NotifyMailer.with(name: user.name, email: user.email).account_deleted_email.deliver_now + + # notify admins about self-delete + Slack::Messengers::UserDeleted.call(name: user.name, user_url: URL.user(user)) rescue StandardError => e DatadogStatsClient.count("users.delete", 1, tags: ["action:failed", "user_id:#{user.id}"]) Honeybadger.context({ user_id: user.id }) diff --git a/spec/services/slack/messengers/user_deleted_spec.rb b/spec/services/slack/messengers/user_deleted_spec.rb new file mode 100644 index 000000000..d20ef6b60 --- /dev/null +++ b/spec/services/slack/messengers/user_deleted_spec.rb @@ -0,0 +1,37 @@ +require "rails_helper" + +RSpec.describe Slack::Messengers::UserDeleted, type: :service do + let(:user) { build(:user) } + + let(:default_params) do + { + name: user.name, + user_url: URL.user(user) + } + end + + it "contains the correct info", :aggregate_failures do + sidekiq_assert_enqueued_jobs(1, only: Slack::Messengers::Worker) do + described_class.call(default_params) + end + + job = sidekiq_enqueued_jobs(worker: Slack::Messengers::Worker).last + message = job["args"].first["message"] + + expect(message).to include("self-deleted their account") + expect(message).to include(URL.user(user)) + end + + it "messages the proper channel with the proper username and emoji", :aggregate_failures do + sidekiq_assert_enqueued_jobs(1, only: Slack::Messengers::Worker) do + described_class.call(default_params) + end + + job = sidekiq_enqueued_jobs(worker: Slack::Messengers::Worker).last + job_args = job["args"].first + + expect(job_args["channel"]).to eq("user-deleted") + expect(job_args["username"]).to eq("user_deleted_bot") + expect(job_args["icon_emoji"]).to eq(":scissors:") + end +end diff --git a/spec/workers/users/delete_worker_spec.rb b/spec/workers/users/delete_worker_spec.rb index 08b294329..1e35c94fd 100644 --- a/spec/workers/users/delete_worker_spec.rb +++ b/spec/workers/users/delete_worker_spec.rb @@ -5,6 +5,8 @@ RSpec.describe Users::DeleteWorker, type: :worker do let(:mailer_class) { NotifyMailer } let(:mailer) { double } let(:message_delivery) { double } + let(:slack_messenger_class) { Slack::Messengers::UserDeleted } + let(:slack_messenger) { double } describe "#perform" do let!(:user) { create(:user) } @@ -46,6 +48,18 @@ RSpec.describe Users::DeleteWorker, type: :worker do expect(mailer).to have_received(:account_deleted_email) expect(message_delivery).to have_received(:deliver_now) end + + it "sends the gdpr notification" do + allow(slack_messenger_class).to receive(:call) + worker.perform(user.id) + expect(slack_messenger_class).to have_received(:call).with(name: user.name, user_url: URL.user(user)) + end + + it "doesn't send the gdpr notification for admin triggered deletion" do + allow(slack_messenger_class).to receive(:call) + worker.perform(user.id, true) + expect(slack_messenger_class).not_to have_received(:call) + end end context "when user is not found" do