diff --git a/app/models/user.rb b/app/models/user.rb index 20c1d35532..f0fc6ac22e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -115,6 +115,7 @@ class User < ActiveRecord::Base after_save :expire_old_email_tokens after_save :index_search after_commit :trigger_user_created_event, on: :create + after_commit :trigger_user_destroyed_event, on: :destroy before_destroy do # These tables don't have primary keys, so destroying them with activerecord is tricky: @@ -1270,6 +1271,11 @@ class User < ActiveRecord::Base true end + def trigger_user_destroyed_event + DiscourseEvent.trigger(:user_destroyed, self) + true + end + def set_skip_validate_email if self.primary_email self.primary_email.skip_validate_email = !should_validate_email_address? diff --git a/config/initializers/012-web_hook_events.rb b/config/initializers/012-web_hook_events.rb index 671fbd56b7..d96857c723 100644 --- a/config/initializers/012-web_hook_events.rb +++ b/config/initializers/012-web_hook_events.rb @@ -41,6 +41,7 @@ end user_logged_in user_approved user_updated + user_destroyed ).each do |event| DiscourseEvent.on(event) do |user| WebHook.enqueue_object_hooks(:user, user, event) diff --git a/spec/models/web_hook_spec.rb b/spec/models/web_hook_spec.rb index d37e10b8be..2e456118b1 100644 --- a/spec/models/web_hook_spec.rb +++ b/spec/models/web_hook_spec.rb @@ -291,6 +291,13 @@ describe WebHook do expect(job_args["event_name"]).to eq("user_logged_in") payload = JSON.parse(job_args["payload"]) expect(payload["id"]).to eq(user.id) + + UserDestroyer.new(Discourse.system_user).destroy(user) + job_args = Jobs::EmitWebHookEvent.jobs.last["args"].first + + expect(job_args["event_name"]).to eq("user_destroyed") + payload = JSON.parse(job_args["payload"]) + expect(payload["id"]).to eq(user.id) end it 'should enqueue the right hooks for category events' do diff --git a/spec/services/user_destroyer_spec.rb b/spec/services/user_destroyer_spec.rb index 0b506f5c7c..bb526d4040 100644 --- a/spec/services/user_destroyer_spec.rb +++ b/spec/services/user_destroyer_spec.rb @@ -55,6 +55,13 @@ describe UserDestroyer do UserDestroyer.new(@admin).destroy(@user, destroy_opts.merge(quiet: true)) }.to_not change { UserHistory.where(action: UserHistory.actions[:delete_user]).count } end + + it 'triggers a extensibility event' do + event = DiscourseEvent.track_events { destroy }.last + + expect(event[:event_name]).to eq(:user_destroyed) + expect(event[:params].first).to eq(@user) + end end shared_examples "email block list" do