2014-02-06 19:06:35 -05:00
|
|
|
module Jobs
|
|
|
|
|
|
|
|
class NotifyMailingListSubscribers < Jobs::Base
|
|
|
|
|
2016-04-06 22:56:43 -04:00
|
|
|
sidekiq_options queue: 'low'
|
|
|
|
|
2014-02-06 19:06:35 -05:00
|
|
|
def execute(args)
|
2016-03-21 23:50:35 -04:00
|
|
|
return if SiteSetting.disable_mailing_list_mode
|
|
|
|
|
2014-02-06 19:06:35 -05:00
|
|
|
post_id = args[:post_id]
|
2014-11-24 11:40:21 -05:00
|
|
|
post = post_id ? Post.with_deleted.find_by(id: post_id) : nil
|
2014-02-06 19:06:35 -05:00
|
|
|
|
|
|
|
raise Discourse::InvalidParameters.new(:post_id) unless post
|
2014-11-24 11:40:21 -05:00
|
|
|
return if post.trashed? || post.user_deleted? || (!post.topic)
|
2014-02-06 19:06:35 -05:00
|
|
|
|
2014-09-03 17:50:19 -04:00
|
|
|
users =
|
|
|
|
User.activated.not_blocked.not_suspended.real
|
2016-02-16 23:46:19 -05:00
|
|
|
.joins(:user_option)
|
|
|
|
.where(user_options: {mailing_list_mode: true})
|
2014-02-06 19:06:35 -05:00
|
|
|
.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])
|
2014-09-03 17:50:19 -04:00
|
|
|
|
|
|
|
users.each do |user|
|
|
|
|
if Guardian.new(user).can_see?(post)
|
|
|
|
begin
|
2016-03-23 00:08:34 -04:00
|
|
|
if EmailLog.reached_max_emails?(user)
|
|
|
|
EmailLog.create!(
|
|
|
|
email_type: 'mailing_list',
|
|
|
|
to_address: user.email,
|
|
|
|
user_id: user.id,
|
|
|
|
post_id: post.id,
|
|
|
|
skipped: true,
|
|
|
|
skipped_reason: "[MailingList] #{I18n.t('email_log.exceeded_limit')}"
|
|
|
|
)
|
|
|
|
else
|
|
|
|
message = UserNotifications.mailing_list_notify(user, post)
|
|
|
|
Email::Sender.new(message, :mailing_list, user).send if message
|
|
|
|
end
|
2014-09-03 17:50:19 -04:00
|
|
|
rescue => e
|
2016-02-03 13:27:58 -05:00
|
|
|
Discourse.handle_job_exception(e, error_context(args, "Sending post to mailing list subscribers", { user_id: user.id, user_email: user.email }))
|
2014-09-03 17:50:19 -04:00
|
|
|
end
|
|
|
|
end
|
2014-02-06 19:06:35 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|