From f7029615a9173dbcb3660c2fe804727877f956d5 Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Tue, 9 May 2023 11:32:35 +0200 Subject: [PATCH] refactor(email): spread sending of instructeur digest emails over time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- .../instructeur_email_notification_job.rb | 2 +- app/services/notification_service.rb | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/jobs/cron/instructeur_email_notification_job.rb b/app/jobs/cron/instructeur_email_notification_job.rb index a81354da8..756a8b95b 100644 --- a/app/jobs/cron/instructeur_email_notification_job.rb +++ b/app/jobs/cron/instructeur_email_notification_job.rb @@ -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 diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 8158d7e9e..0c17c884e 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -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