From ec36cddd2f39db4261c80d23f6802ecbc5ea4c0c Mon Sep 17 00:00:00 2001 From: Daniel Waterworth Date: Thu, 9 Dec 2021 14:45:07 -0600 Subject: [PATCH] FIX: Defer topic/post created events until emails have been added (#15252) --- lib/email/receiver.rb | 3 +++ spec/components/email/receiver_spec.rb | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index 2f8c4031915..47bc96a9fcb 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -1275,6 +1275,7 @@ module Email # emails, we skip the jobs here and enqueue them only _after_ # the incoming email has been updated with the post and topic. options[:skip_jobs] = true + options[:skip_events] = true result = NewPostManager.new(user, options).perform errors = result.errors.full_messages @@ -1305,6 +1306,8 @@ module Email import_mode: options[:import_mode], post_alert_options: options[:post_alert_options] ).enqueue_jobs + DiscourseEvent.trigger(:topic_created, result.post.topic, options, user) + DiscourseEvent.trigger(:post_created, result.post, options, user) end result.post diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index 4b7480e5c52..235a098ab6a 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -1364,6 +1364,14 @@ describe Email::Receiver do end it "works" do + handler_calls = 0 + handler = proc { |topic| + expect(topic.incoming_email_addresses).to contain_exactly("discourse@bar.com", "category@foo.com") + handler_calls += 1 + } + + DiscourseEvent.on(:topic_created, &handler) + user = Fabricate(:user, email: "existing@bar.com", trust_level: SiteSetting.email_in_min_trust) group = Fabricate(:group) @@ -1380,6 +1388,9 @@ describe Email::Receiver do # allows new user to create a topic expect { process(:new_user) }.to change(Topic, :count) + + DiscourseEvent.off(:topic_created, &handler) + expect(handler_calls).to eq(1) end it "creates visible topic for ham" do