You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.4 KiB
131 lines
3.4 KiB
class DeviseNotifyMailer < Devise::Mailer |
|
require "notifications/client" |
|
|
|
def notify_client |
|
@notify_client ||= ::Notifications::Client.new(ENV["GOVUK_NOTIFY_API_KEY"]) |
|
end |
|
|
|
def send_email(email_address, template_id, personalisation) |
|
return true if intercept_send?(email_address) |
|
|
|
notify_client.send_email( |
|
email_address:, |
|
template_id:, |
|
personalisation:, |
|
) |
|
rescue Notifications::Client::BadRequestError => e |
|
Sentry.capture_exception(e) |
|
|
|
true |
|
end |
|
|
|
def personalisation(record, token, url, username: false) |
|
{ |
|
name: record.name || record.email, |
|
email: username || record.email, |
|
organisation: record.respond_to?(:organisation) ? record.organisation.name : "", |
|
link: "#{url}#{token}", |
|
} |
|
end |
|
|
|
def reset_password_instructions(record, token, _opts = {}) |
|
base = public_send("edit_#{record.class.name.underscore}_password_url") |
|
url = "#{base}?reset_password_token=" |
|
send_email( |
|
record.email, |
|
record.reset_password_notify_template, |
|
personalisation(record, token, url), |
|
) |
|
end |
|
|
|
def confirmation_instructions(record, token, _opts = {}) |
|
if email_changed?(record) |
|
if new_email_journey? |
|
send_email_changed_to_old_email(record) |
|
send_email_changed_to_new_email(record, token) |
|
else |
|
send_confirmation_email(record.unconfirmed_email, record, token, record.unconfirmed_email) |
|
send_confirmation_email(record.email, record, token, record.unconfirmed_email) |
|
end |
|
else |
|
send_confirmation_email(record.email, record, token, record.email) |
|
end |
|
end |
|
|
|
def intercept_send?(email) |
|
return false unless email_allowlist |
|
|
|
email_domain = email.split("@").last.downcase |
|
!(Rails.env.production? || Rails.env.test?) && email_allowlist.exclude?(email_domain) |
|
end |
|
|
|
def email_allowlist |
|
Rails.application.credentials[:email_allowlist] || [] |
|
end |
|
|
|
def send_email_changed_to_old_email(record) |
|
return true if intercept_send?(record.email) |
|
|
|
send_email( |
|
record.email, |
|
User::FOR_OLD_EMAIL_CHANGED_BY_OTHER_USER_TEMPLATE_ID, |
|
{ |
|
new_email: record.unconfirmed_email, |
|
old_email: record.email, |
|
}, |
|
) |
|
end |
|
|
|
def send_email_changed_to_new_email(record, token) |
|
return true if intercept_send?(record.email) |
|
|
|
link = "#{user_confirmation_url}?confirmation_token=#{token}" |
|
|
|
send_email( |
|
record.unconfirmed_email, |
|
User::FOR_NEW_EMAIL_CHANGED_BY_OTHER_USER_TEMPLATE_ID, |
|
{ |
|
new_email: record.unconfirmed_email, |
|
old_email: record.email, |
|
link:, |
|
}, |
|
) |
|
end |
|
|
|
def email_changed?(record) |
|
( |
|
record.confirmable_template == User::CONFIRMABLE_TEMPLATE_ID && ( |
|
record.unconfirmed_email.present? && record.unconfirmed_email != record.email) |
|
) || ( |
|
new_email_journey? && |
|
record.versions.last.changeset.key?("unconfirmed_email") && |
|
record.confirmed? |
|
) |
|
end |
|
|
|
def new_email_journey? |
|
FeatureToggle.new_email_journey? |
|
end |
|
|
|
def send_confirmation_email(email, record, token, username) |
|
url = "#{user_confirmation_url}?confirmation_token=" |
|
|
|
send_email( |
|
email, |
|
record.confirmable_template, |
|
personalisation(record, token, url, username:), |
|
) |
|
end |
|
|
|
# def unlock_instructions(record, token, opts = {}) |
|
# super |
|
# end |
|
# |
|
# def email_changed(record, opts = {}) |
|
# super |
|
# end |
|
# |
|
# def password_change(record, opts = {}) |
|
# super |
|
# end |
|
end
|
|
|