tech(refactor): deplace le mail rate limiter dans le module dédié à l'expiration

This commit is contained in:
Martin 2023-11-07 07:33:12 +01:00 committed by mfo
parent fb238ff7ac
commit aecc41490b
5 changed files with 13 additions and 30 deletions

View file

@ -1,13 +0,0 @@
module MailRateLimitable
extend ActiveSupport::Concern
included do
def initialize(rate_limiter: MailRateLimiter.new(limit: 200, window: 10.minutes))
@rate_limiter = rate_limiter
end
def safe_send_email(mail)
@rate_limiter.send_with_delay(mail)
end
end
end

View file

@ -1,6 +1,4 @@
class Expired::DossiersDeletionService
include MailRateLimitable
class Expired::DossiersDeletionService < Expired::MailRateLimiter
def process_expired_dossiers_brouillon
send_brouillon_expiration_notices
delete_expired_brouillons_and_notify
@ -30,7 +28,7 @@ class Expired::DossiersDeletionService
dossiers,
email
)
safe_send_email(mail)
send_with_delay(mail)
end
end
@ -59,7 +57,7 @@ class Expired::DossiersDeletionService
dossiers_hash,
email
)
safe_send_email(mail)
send_with_delay(mail)
end
end
@ -81,11 +79,11 @@ class Expired::DossiersDeletionService
user_notifications.each do |(email, dossiers)|
mail = DossierMailer.notify_near_deletion_to_user(dossiers, email)
safe_send_email(mail)
send_with_delay(mail)
end
administration_notifications.each do |(email, dossiers)|
mail = DossierMailer.notify_near_deletion_to_administration(dossiers, email)
safe_send_email(mail)
send_with_delay(mail)
end
end
@ -108,7 +106,7 @@ class Expired::DossiersDeletionService
DeletedDossier.where(dossier_id: dossier_ids).to_a,
email
)
safe_send_email(mail)
send_with_delay(mail)
end
end
administration_notifications.each do |(email, dossier_ids)|
@ -118,7 +116,7 @@ class Expired::DossiersDeletionService
DeletedDossier.where(dossier_id: dossier_ids).to_a,
email
)
safe_send_email(mail)
send_with_delay(mail)
end
end
end

View file

@ -1,4 +1,4 @@
class MailRateLimiter
class Expired::MailRateLimiter
attr_reader :delay, :current_window
def send_with_delay(mail)
@ -15,7 +15,7 @@ class MailRateLimiter
private
def initialize(limit:, window:)
def initialize(limit: 200, window: 10.minutes)
@limit = limit
@window = window
@current_window = { started_at: Time.current, sent: 0 }

View file

@ -1,6 +1,4 @@
class Expired::UsersDeletionService
include MailRateLimitable
class Expired::UsersDeletionService < Expired::MailRateLimiter
RETENTION_AFTER_NOTICE_IN_WEEK = 2
EXPIRABLE_AFTER_IN_YEAR = 2
@ -16,7 +14,7 @@ class Expired::UsersDeletionService
def send_inactive_close_to_expiration_notice(users)
to_notify_only(users).in_batches do |batch|
batch.each do |user|
safe_send_email(UserMailer.notify_inactive_close_to_deletion(user))
send_with_delay(UserMailer.notify_inactive_close_to_deletion(user))
end
batch.update_all(inactive_close_to_expiration_notice_sent_at: Time.zone.now.utc)
end

View file

@ -1,8 +1,8 @@
describe MailRateLimiter do
describe Expired::MailRateLimiter do
describe 'hits limits' do
let(:limit) { 10 }
let(:window) { 2.seconds }
let(:rate_limiter) { MailRateLimiter.new(limit:, window:) }
let(:rate_limiter) { Expired::MailRateLimiter.new(limit:, window:) }
let(:mail) { DossierMailer.notify_automatic_deletion_to_user([], 'tartampion@france.fr') }
it 'decreases current_window[:limit]' do