discourse/lib/post_jobs_enqueuer.rb
Martin Brennan e43a8af3bd
FIX: Do not send emails to mailing_list_mode subscribers for PMs (#14159)
This bug was introduced by f66007ec83.

In PostJobsEnqueuer we previously did not fire the after_post_create
event and after_topic_create event for private message topics. This was
changed in the above commit in order to publish message bus messages
for topic tracking state updates. Unfortunately this caused the
NotifyMailingListSubscribers job to be enqueued for all posts including
private messages, and admins and the users involved in the PMs got
emailed the contents of the PMs if they had mailing list mode enabled.

Luckily the impact of this was mitigated by a Guardian#can_see? check
for each mailing list mode user in the NotifyMailingListSubscribers job.
We never want to notify mailing list mode subscribers for private messages
so an early return has been added there, plus the logic in PostJobsEnqueuer
has been fixed, and tests have been added to that class where there were
none before.
2021-08-26 15:16:35 +10:00

91 lines
2.1 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)
if !@topic.private_message?
Jobs.enqueue_in(
SiteSetting.email_time_window_mins.minutes,
:notify_mailing_list_subscribers,
post_id: @post.id,
)
end
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