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:
Colin Darie 2023-05-09 11:32:35 +02:00
parent 2b2d65de87
commit f7029615a9
No known key found for this signature in database
GPG key ID: 4FB865FDBCA4BCC4
2 changed files with 12 additions and 10 deletions

View file

@ -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

View file

@ -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