FIX: Set unique post key for a user outside of transaction.

FIX: Set unique post key for a user outside of transaction.

Previously, the Redis key was set within the transaction and the key isn’t deleted if the transaction is not successful.

Note that this isn’t tested because we don’t have a repro of what can raise an error within the transaction.

Body is too similar to what you previously posted - even when previous post didn't go through - bug - Discourse Meta

diff --git a/lib/post_creator.rb b/lib/post_creator.rb
index 173a30c..4c4c079 100644
--- a/lib/post_creator.rb
+++ b/lib/post_creator.rb
@@ -167,7 +167,6 @@ class PostCreator
         create_topic
         save_post
         extract_links
-        store_unique_post_key
         track_topic
         update_topic_stats
         update_topic_auto_close
@@ -182,6 +181,7 @@ class PostCreator
     end
 
     if @post && errors.blank? && !@opts[:import_mode]
+      store_unique_post_key
       # update counters etc.
       @post.topic.reload
 
diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb
index 304491c..8774c64 100644
--- a/spec/components/post_creator_spec.rb
+++ b/spec/components/post_creator_spec.rb
@@ -580,8 +580,9 @@ describe PostCreator do
 
       it "returns blank for another post with the same content" do
         creator.create
-        new_post_creator.create
-        expect(new_post_creator.errors).to be_present
+        post = new_post_creator.create
+
+        expect(post.errors[:raw]).to include(I18n.t(:just_posted_that))
       end
 
       it "returns a post for admins" do

GitHub sha: ec27db78

1 Like

This commit has been mentioned on Discourse Meta. There might be relevant details there: