discourse/app/jobs/regular/notify_mailing_list_subscribers.rb
Sam 3829c78526 PERF: shift most user options out of the user table
As it stands we load up user records quite frequently on the topic pages,
this in turn pulls all the columns for the users being selected, just to
discard them after they are loaded

New structure keeps all options in a discrete table, this is better organised
and allows us to easily add more column without worrying about bloating the
user table
2016-02-17 18:08:25 +11:00

46 lines
1.6 KiB
Ruby

module Jobs
class NotifyMailingListSubscribers < Jobs::Base
def execute(args)
post_id = args[:post_id]
post = post_id ? Post.with_deleted.find_by(id: post_id) : nil
raise Discourse::InvalidParameters.new(:post_id) unless post
return if post.trashed? || post.user_deleted? || (!post.topic)
users =
User.activated.not_blocked.not_suspended.real
.joins(:user_option)
.where(user_options: {mailing_list_mode: true})
.where('NOT EXISTS(
SELECT 1
FROM topic_users tu
WHERE
tu.topic_id = ? AND
tu.user_id = users.id AND
tu.notification_level = ?
)', post.topic_id, TopicUser.notification_levels[:muted])
.where('NOT EXISTS(
SELECT 1
FROM category_users cu
WHERE
cu.category_id = ? AND
cu.user_id = users.id AND
cu.notification_level = ?
)', post.topic.category_id, CategoryUser.notification_levels[:muted])
users.each do |user|
if Guardian.new(user).can_see?(post)
begin
message = UserNotifications.mailing_list_notify(user, post)
Email::Sender.new(message, :mailing_list, user).send if message
rescue => e
Discourse.handle_job_exception(e, error_context(args, "Sending post to mailing list subscribers", { user_id: user.id, user_email: user.email }))
end
end
end
end
end
end