FIX: Concurrency issues with making topic embedded posts visible

This commit is contained in:
Robin Ward 2020-04-20 15:11:59 -04:00
parent e997a1f315
commit 25bed4f643
4 changed files with 28 additions and 12 deletions

View File

@ -0,0 +1,15 @@
# frozen_string_literal: true
module Jobs
class MakeEmbeddedTopicVisible < ::Jobs::Base
def execute(args)
raise Discourse::InvalidParameters.new(:topic_id) if args[:topic_id].blank?
if topic = Topic.find_by(id: args[:topic_id])
topic.update_status('visible', true, topic.user)
end
end
end
end

View File

@ -186,7 +186,6 @@ class PostCreator
@post.link_post_uploads
update_uploads_secure_status
ensure_in_allowed_users if guardian.is_staff?
make_visible
unarchive_message
if !@opts[:import_mode]
DraftSequence.next!(@user, draft_key)
@ -415,17 +414,6 @@ class PostCreator
end
end
def make_visible
return unless SiteSetting.embed_unlisted?
return unless @post.post_number > 1
return if @post.topic.visible?
return if @post.post_type != Post.types[:regular]
if embed = @post.topic.topic_embed
@post.topic.update_status('visible', true, @user)
end
end
def unarchive_message
return unless @topic.private_message? && @topic.id

View File

@ -18,6 +18,7 @@ class PostJobsEnqueuer
unless skip_after_create?
after_post_create
after_topic_create
make_visible
end
if @topic.private_message?
@ -44,6 +45,17 @@ class PostJobsEnqueuer
@post.trigger_post_process(new_post: true)
end
def make_visible
return unless SiteSetting.embed_unlisted?
return unless @post.post_number > 1
return if @topic.visible?
return if @post.post_type != Post.types[:regular]
if @topic.topic_embed.present?
Jobs.enqueue(:make_embedded_topic_visible, topic_id: @topic.id)
end
end
def after_post_create
TopicTrackingState.publish_unread(@post) if @post.post_number > 1
TopicTrackingState.publish_latest(@topic, @post.whisper?)

View File

@ -75,6 +75,7 @@ describe TopicEmbed do
end
it "will make the topic unlisted if `embed_unlisted` is set until someone replies" do
Jobs.run_immediately!
SiteSetting.embed_unlisted = true
imported_post = TopicEmbed.import(user, "http://eviltrout.com/abcd", title, "some random content")
expect(imported_post.topic).not_to be_visible