refactor(email): spread sending of instructeur digest emails over time
On envoi parfois plus de 20K mails, ce qui pose des problèmes de délivrance et quotas si on le fait d'un coup. On étale donc un peu dans la durée ces envois pour pas limiter le dépassement de quota.
This commit is contained in:
parent
2b2d65de87
commit
f7029615a9
2 changed files with 12 additions and 10 deletions
|
@ -1,5 +1,5 @@
|
|||
class Cron::InstructeurEmailNotificationJob < Cron::CronJob
|
||||
self.schedule_expression = "from monday through friday at 10 am"
|
||||
self.schedule_expression = "from monday through friday at 9 am"
|
||||
|
||||
def perform(*args)
|
||||
NotificationService.send_instructeur_email_notification
|
||||
|
|
|
@ -1,19 +1,21 @@
|
|||
class NotificationService
|
||||
class << self
|
||||
SPREAD_DURATION = 2.hours
|
||||
|
||||
def send_instructeur_email_notification
|
||||
Instructeur
|
||||
instructeurs = Instructeur
|
||||
.includes(assign_to: [:procedure])
|
||||
.where(assign_tos: { daily_email_notifications_enabled: true })
|
||||
.find_in_batches { |instructeurs| send_batch_of_instructeurs_email_notification(instructeurs) }
|
||||
end
|
||||
|
||||
private
|
||||
instructeurs.in_batches.each_record do |instructeur|
|
||||
data = instructeur.email_notification_data
|
||||
|
||||
def send_batch_of_instructeurs_email_notification(instructeurs)
|
||||
instructeurs
|
||||
.map { |instructeur| [instructeur, instructeur.email_notification_data] }
|
||||
.reject { |(_instructeur, data)| data.empty? }
|
||||
.each { |(instructeur, data)| InstructeurMailer.send_notifications(instructeur, data).deliver_later }
|
||||
next if data.empty?
|
||||
|
||||
wait = rand(0..SPREAD_DURATION)
|
||||
|
||||
InstructeurMailer.send_notifications(instructeur, data).deliver_later(wait:)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue