FIX: prevents creating post from impacting the app (#28518)

Create a topic can fail in many different ways and we don't want this to impact the rest of the application, the call will now be wrapped in a begin/rescue block and log an error if it fails.
This commit is contained in:
Joffrey JAFFEUX 2024-08-23 15:17:16 +02:00 committed by GitHub
parent 5a8e7c5f29
commit 6bdda3cb71
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 8 deletions

View File

@ -60,14 +60,19 @@ DiscourseAutomation::Scriptable.add(DiscourseAutomation::Scripts::TOPIC) do
end
tags = fields.dig("tags", "value") || []
new_post =
PostCreator.new(
creator,
raw: topic_raw,
title: title,
category: category.id,
tags: tags,
).create!
begin
new_post =
PostCreator.new(
creator,
raw: topic_raw,
title: title,
category: category.id,
tags: tags,
).create!
rescue StandardError => e
Rails.logger.warn "[discourse-automation] couldn't create post: #{e.message}"
next
end
if context["kind"] == DiscourseAutomation::Triggers::USER_UPDATED && new_post.persisted?
user.user_custom_fields.create(name: automation.name, value: "true")

View File

@ -165,5 +165,25 @@ describe "Topic" do
}.by(1)
end
end
context "when creating the post fails" do
before do
@orig_logger = Rails.logger
Rails.logger = @fake_logger = FakeLogger.new
end
after { Rails.logger = @orig_logger }
it "logs a warning" do
expect { UserUpdater.new(user, user).update(location: "Japan") }.to change {
Topic.count
}.by(1)
expect { UserUpdater.new(user, user).update(location: "Japan") }.not_to change {
Topic.count
}
expect(Rails.logger.warnings.first).to match(/Title has already been used/)
end
end
end
end