From 534ce34f87eddb1d3c0462c4546d30ca683dd701 Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 18 Apr 2023 16:15:47 +0200 Subject: [PATCH] =?UTF-8?q?amelioration(Dolist::ApiSender):=20l=C3=A8ve=20?= =?UTF-8?q?une=20Dolist::IgnorableError=20afin=20de=20l'inscrire=20dans=20?= =?UTF-8?q?l'historique=20des=20EmailEvent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/lib/dolist/api.rb | 14 ++++++++++++-- app/mailers/concerns/mailer_monitoring_concern.rb | 8 +++++++- config/initializers/dolist.rb | 12 ++++++------ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/lib/dolist/api.rb b/app/lib/dolist/api.rb index 48d07d5fc..388271f67 100644 --- a/app/lib/dolist/api.rb +++ b/app/lib/dolist/api.rb @@ -154,6 +154,18 @@ class Dolist::API post(url, body)["FieldList"].find { _1['ID'] == 72 }['Value'] end + def ignorable_error?(response, mail) + error_code = response&.dig("ResponseStatus", "ErrorCode") + invalid_contact_status = if ignorable_api_error_code?(error_code) + fetch_contact_status(mail.to.first) + else + nil + end + [error_code, invalid_contact_status] + end + + private + def ignorable_api_error_code?(api_error_code) IGNORABLE_API_ERROR_CODE.include?(api_error_code) end @@ -162,8 +174,6 @@ class Dolist::API IGNORABLE_CONTACT_STATUSES.include?(contact_status) end - private - def format_url(base) format(base, account_id: account_id) end diff --git a/app/mailers/concerns/mailer_monitoring_concern.rb b/app/mailers/concerns/mailer_monitoring_concern.rb index 6cbd60247..f140c20fa 100644 --- a/app/mailers/concerns/mailer_monitoring_concern.rb +++ b/app/mailers/concerns/mailer_monitoring_concern.rb @@ -19,12 +19,18 @@ module MailerMonitoringConcern end end + rescue_from Dolist::IgnorableError, with: :log_delivery_error + def log_and_raise_delivery_error(exception) - EmailEvent.create_from_message!(message, status: "dispatch_error") + log_delivery_error(exception) Sentry.capture_exception(exception, extra: { to: message.to, subject: message.subject }) # re-raise another error so job will retry later raise MailDeliveryError.new(exception) end + + def log_delivery_error(exception) + EmailEvent.create_from_message!(message, status: "dispatch_error") + end end end diff --git a/config/initializers/dolist.rb b/config/initializers/dolist.rb index 3e04792aa..cdf1f2384 100644 --- a/config/initializers/dolist.rb +++ b/config/initializers/dolist.rb @@ -1,5 +1,8 @@ ActiveSupport.on_load(:action_mailer) do module Dolist + class IgnorableError < StandardError + end + class SMTP < ::Mail::SMTP def deliver!(mail) mail.from(ENV['DOLIST_NO_REPLY_EMAIL']) @@ -20,14 +23,11 @@ ActiveSupport.on_load(:action_mailer) do if response&.dig("Result") mail.message_id = response.dig("Result") else - error_code = response&.dig("ResponseStatus", "ErrorCode") + _, invalid_contact_status = client.ignorable_error?(response, mail) - contact_status = if client.ignorable_api_error_code?(error_code) - client.fetch_contact_status(mail.to.first) + if invalid_contact_status + raise Dolist::IgnorableError.new("DoList delivery error. contact unreachable: #{invalid_contact_status}") else - nil - end - if !client.ignorable_contact_status?(contact_status) fail "DoList delivery error. Body: #{response}" end end