FIX: Ensure post_created event fires even if topic_created event hooks have exceptions (#38146)

Currently, if `on(:topic_created)` has an error, all subsequent triggers
like `on(:post_created)` would not be triggered. 😱

This PR ensures post created registered event hooks will also trigger
even if the topic created ones fail. Events being rescued are outside of
topic and post creation transactions.
This commit is contained in:
Natalie Tay
2026-03-03 19:38:50 +08:00
committed by GitHub
parent 38ad2acd2c
commit 2a085cad2c
2 changed files with 26 additions and 2 deletions
+11 -2
View File
@@ -266,8 +266,17 @@ class PostCreator
end
def trigger_after_events
DiscourseEvent.trigger(:topic_created, @post.topic, @opts, @user) unless @opts[:topic_id]
DiscourseEvent.trigger(:post_created, @post, @opts, @user)
begin
DiscourseEvent.trigger(:topic_created, @post.topic, @opts, @user) unless @opts[:topic_id]
rescue => e
Discourse.warn_exception(e, message: "Error in 'topic_created' event handler")
end
begin
DiscourseEvent.trigger(:post_created, @post, @opts, @user)
rescue => e
Discourse.warn_exception(e, message: "Error in 'post_created' event handler")
end
end
def self.track_post_stats
+15
View File
@@ -1653,6 +1653,21 @@ RSpec.describe PostCreator do
expect(@posts_created).to eq(1)
expect(@topics_created).to eq(0)
end
it "fires post_created even when topic_created handler raises" do
bad_handler = proc { raise "topic_created boom" }
DiscourseEvent.on(:topic_created, &bad_handler)
PostCreator.new(
user,
raw: "this is the new content for my topic",
title: "this is my new topic title",
).create
expect(@posts_created).to eq(1)
ensure
DiscourseEvent.off(:topic_created, &bad_handler)
end
end
describe "staged users" do