mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 09:42:07 +08:00
f66007ec83
There are certain design decisions that were made in this commit. Private messages implements its own version of topic tracking state because there are significant differences between regular and private_message topics. Regular topics have to track categories and tags while private messages do not. It is much easier to design the new topic tracking state if we maintain two different classes, instead of trying to mash this two worlds together. One MessageBus channel per user and one MessageBus channel per group. This allows each user and each group to have their own channel backlog instead of having one global channel which requires the client to filter away unrelated messages.
88 lines
2.0 KiB
Ruby
88 lines
2.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class PostJobsEnqueuer
|
|
def initialize(post, topic, new_topic, opts = {})
|
|
@post = post
|
|
@topic = topic
|
|
@new_topic = new_topic
|
|
@opts = opts
|
|
end
|
|
|
|
def enqueue_jobs
|
|
# We need to enqueue jobs after the transaction.
|
|
# Otherwise they might begin before the data has been committed.
|
|
enqueue_post_alerts unless @opts[:import_mode]
|
|
feature_topic_users unless @opts[:import_mode]
|
|
trigger_post_post_process
|
|
|
|
unless skip_after_create?
|
|
after_post_create
|
|
after_topic_create
|
|
make_visible
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def enqueue_post_alerts
|
|
Jobs.enqueue(:post_alert,
|
|
post_id: @post.id,
|
|
new_record: true,
|
|
options: @opts[:post_alert_options],
|
|
)
|
|
end
|
|
|
|
def feature_topic_users
|
|
Jobs.enqueue(:feature_topic_users, topic_id: @topic.id)
|
|
end
|
|
|
|
def trigger_post_post_process
|
|
@post.trigger_post_process(new_post: true)
|
|
end
|
|
|
|
def make_visible
|
|
return if @topic.private_message?
|
|
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
|
|
Jobs.enqueue(:post_update_topic_tracking_state, post_id: @post.id)
|
|
|
|
Jobs.enqueue_in(SiteSetting.email_time_window_mins.minutes,
|
|
:notify_mailing_list_subscribers,
|
|
post_id: @post.id,
|
|
)
|
|
end
|
|
|
|
def after_topic_create
|
|
return unless @new_topic
|
|
# Don't publish invisible topics
|
|
return unless @topic.visible?
|
|
|
|
@topic.posters = @topic.posters_summary
|
|
@topic.posts_count = 1
|
|
|
|
klass =
|
|
if @topic.private_message?
|
|
PrivateMessageTopicTrackingState
|
|
else
|
|
TopicTrackingState
|
|
end
|
|
|
|
klass.publish_new(@topic)
|
|
end
|
|
|
|
def skip_after_create?
|
|
@opts[:import_mode] ||
|
|
@post.post_type == Post.types[:moderator_action] ||
|
|
@post.post_type == Post.types[:small_action]
|
|
end
|
|
end
|