mirror of
https://github.com/discourse/discourse.git
synced 2026-08-03 01:49:44 -05:00
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:
+11
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user