Skip to content

Commit 15e8a80

Browse files
Add user_anonymized webhook event (#36208)
This change adds webhook support for the user anonymization event, allowing external systems to be notified when a user is anonymized in Discourse. Changes: - Add user_anonymized event type (ID: 310) to WebHookEventType - Wires up DiscourseEvent listener to trigger webhooks on anonymization - Add translation string for the event in admin UI - Add database fixture to seed the event type - Add comprehensive test coverage The webhook is triggered when UserAnonymizer.make_anonymous is called and sends the anonymized user data using WebHookUserSerializer. Nudged along the path by Claude Code
1 parent 06b34d5 commit 15e8a80

File tree

6 files changed

+34
-0
lines changed

6 files changed

+34
-0
lines changed

app/models/web_hook_event_type.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class WebHookEventType < ActiveRecord::Base
5959
user_destroyed: 307,
6060
user_suspended: 308,
6161
user_unsuspended: 309,
62+
user_anonymized: 310,
6263
group_created: 401,
6364
group_updated: 402,
6465
group_destroyed: 403,

config/initializers/012-web_hook_events.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@
4747
DiscourseEvent.on(event) { |args| WebHook.enqueue_object_hooks(:user, args[:user], event) }
4848
end
4949

50+
DiscourseEvent.on(:user_anonymized) do |args|
51+
WebHook.enqueue_object_hooks(:user, args[:user], :user_anonymized)
52+
end
53+
5054
%i[group_created group_updated].each do |event|
5155
DiscourseEvent.on(event) { |group| WebHook.enqueue_object_hooks(:group, group, event) }
5256
end

config/locales/client.en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6623,6 +6623,7 @@ en:
66236623
user_destroyed: "User is deleted"
66246624
user_suspended: "User is suspended"
66256625
user_unsuspended: "User is unsuspended"
6626+
user_anonymized: "User is anonymized"
66266627
reviewable_event:
66276628
group_name: "Reviewable Events"
66286629
reviewable_created: "Reviewable item is ready"

db/fixtures/007_web_hook_event_types.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@
9090
b.name = "user_unsuspended"
9191
b.group = WebHookEventType.groups[:user]
9292
end
93+
WebHookEventType.seed do |b|
94+
b.id = WebHookEventType::TYPES[:user_anonymized]
95+
b.name = "user_anonymized"
96+
b.group = WebHookEventType.groups[:user]
97+
end
9398
WebHookEventType.seed do |b|
9499
b.id = WebHookEventType::TYPES[:group_created]
95100
b.name = "group_created"

spec/initializers/web_hook_events_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,28 @@
2929
end
3030
end
3131

32+
describe "user events" do
33+
fab!(:user_webhook) do
34+
wh = Fabricate(:web_hook)
35+
wh.web_hook_event_types = [WebHookEventType.find_by(name: "user_anonymized")]
36+
wh.save!
37+
wh
38+
end
39+
40+
it "enqueues user_anonymized webhook event" do
41+
target_user = Fabricate(:user)
42+
43+
expect { UserAnonymizer.make_anonymous(target_user, user) }.to change {
44+
Jobs::EmitWebHookEvent.jobs.size
45+
}.by(1)
46+
47+
job_args = Jobs::EmitWebHookEvent.jobs.last["args"].first
48+
expect(job_args["id"]).to eq(target_user.id)
49+
expect(job_args["event_name"]).to eq("user_anonymized")
50+
expect(job_args["event_type"]).to eq("user")
51+
end
52+
end
53+
3254
describe "reviewable events" do
3355
fab!(:reviewable_webhook) do
3456
wh = Fabricate(:web_hook, categories: [post.topic.category])

spec/models/web_hook_event_type_spec.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
user_destroyed
2525
user_suspended
2626
user_unsuspended
27+
user_anonymized
2728
group_created
2829
group_updated
2930
group_destroyed

0 commit comments

Comments
 (0)