Merge pull request #1166 from internetee/refactor-domain-mailer

Refactor domain mailer
This commit is contained in:
Timo Võhmar 2019-04-23 13:05:10 +03:00 committed by GitHub
commit 718bcbcea6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 175 additions and 108 deletions

View file

@ -3,9 +3,9 @@ class DomainDeleteConfirmEmailJob < Que::Job
domain = Domain.find(domain_id) domain = Domain.find(domain_id)
log(domain) log(domain)
DomainDeleteMailer.confirmation(domain: domain, DomainDeleteMailer.confirmation_request(domain: domain,
registrar: domain.registrar, registrar: domain.registrar,
registrant: domain.registrant).deliver_now registrant: domain.registrant).deliver_now
end end
private private

View file

@ -19,7 +19,13 @@ class DomainDeleteConfirmJob < Que::Job
domain.save(validate: false) domain.save(validate: false)
raise_errors!(domain) raise_errors!(domain)
DomainMailer.pending_delete_rejected_notification(domain_id, true).deliver if domain.registrant_verification_token.blank?
Rails.logger.warn "EMAIL NOT DELIVERED: registrant_verification_token is missing for #{domain.name}"
elsif domain.registrant_verification_asked_at.blank?
Rails.logger.warn "EMAIL NOT DELIVERED: registrant_verification_asked_at is missing for #{domain.name}"
else
DomainDeleteMailer.rejected(domain).deliver_now
end
end end
destroy # it's best to destroy the job in the same transaction destroy # it's best to destroy the job in the same transaction

View file

@ -3,7 +3,7 @@ class DomainDeleteMailer < ApplicationMailer
%w[private_person legal_person] %w[private_person legal_person]
end end
def confirmation(domain:, registrar:, registrant:) def confirmation_request(domain:, registrar:, registrant:)
@domain = DomainPresenter.new(domain: domain, view: view_context) @domain = DomainPresenter.new(domain: domain, view: view_context)
@registrar = RegistrarPresenter.new(registrar: registrar, view: view_context) @registrar = RegistrarPresenter.new(registrar: registrar, view: view_context)
@confirmation_url = confirmation_url(domain) @confirmation_url = confirmation_url(domain)
@ -12,6 +12,27 @@ class DomainDeleteMailer < ApplicationMailer
mail(to: registrant.email, subject: subject) mail(to: registrant.email, subject: subject)
end end
def accepted(domain)
@domain = domain
subject = default_i18n_subject(domain: domain.name)
mail(to: domain.registrant.email, subject: subject)
end
def rejected(domain)
@domain = domain
subject = default_i18n_subject(domain: domain.name)
mail(to: domain.registrant.email, subject: subject)
end
def expired(domain)
@domain = domain
subject = default_i18n_subject(domain: domain.name)
mail(to: domain.registrant.email, subject: subject)
end
def forced(domain:, registrar:, registrant:, template_name:) def forced(domain:, registrar:, registrant:, template_name:)
@domain = DomainPresenter.new(domain: domain, view: view_context) @domain = DomainPresenter.new(domain: domain, view: view_context)
@registrar = RegistrarPresenter.new(registrar: registrar, view: view_context) @registrar = RegistrarPresenter.new(registrar: registrar, view: view_context)

View file

@ -1,45 +0,0 @@
class DomainMailer < ApplicationMailer
include Que::Mailer
def pending_delete_rejected_notification(domain_id, should_deliver)
@domain = Domain.find_by(id: domain_id)
return unless @domain
return if delivery_off?(@domain, should_deliver)
# no delivery off control, driggered by que, no epp request
if @domain.registrant_verification_token.blank?
logger.warn "EMAIL NOT DELIVERED: registrant_verification_token is missing for #{@domain.name}"
return
end
if @domain.registrant_verification_asked_at.blank?
logger.warn "EMAIL NOT DELIVERED: registrant_verification_asked_at is missing for #{@domain.name}"
return
end
mail(to: format(@domain.registrant.email),
subject: "#{I18n.t(:pending_delete_rejected_notification_subject,
name: @domain.name)} [#{@domain.name}]")
end
def pending_delete_expired_notification(domain_id, should_deliver)
@domain = Domain.find_by(id: domain_id)
return unless @domain
return if delivery_off?(@domain, should_deliver)
# no delivery off control, driggered by cron, no epp request
mail(to: format(@domain.registrant.email),
subject: "#{I18n.t(:pending_delete_expired_notification_subject,
name: @domain.name)} [#{@domain.name}]")
end
def delete_confirmation(domain_id, should_deliver)
@domain = Domain.find_by(id: domain_id)
return unless @domain
return if delivery_off?(@domain, should_deliver)
mail(to: format(@domain.registrant.email),
subject: "#{I18n.t(:delete_confirmation_subject,
name: @domain.name)} [#{@domain.name}]")
end
end

View file

@ -167,7 +167,7 @@ class Domain < ActiveRecord::Base
errors.add(:statuses, :taken) errors.add(:statuses, :taken)
end end
attr_accessor :registrant_typeahead, :update_me, :deliver_emails, attr_accessor :registrant_typeahead, :update_me,
:epp_pending_update, :epp_pending_delete, :reserved_pw :epp_pending_update, :epp_pending_delete, :reserved_pw
def subordinate_nameservers def subordinate_nameservers

View file

@ -19,7 +19,7 @@ class DomainCron
RegistrantChangeExpiredEmailJob.enqueue(domain.id) RegistrantChangeExpiredEmailJob.enqueue(domain.id)
end end
if domain.pending_delete? || domain.pending_delete_confirmation? if domain.pending_delete? || domain.pending_delete_confirmation?
DomainMailer.pending_delete_expired_notification(domain.id, true).deliver DomainDeleteMailer.expired(domain).deliver_now
end end
domain.preclean_pendings domain.preclean_pendings

View file

@ -483,8 +483,6 @@ class Epp::Domain < Domain
registrant_verification_asked!(frame.to_s, current_user.id) registrant_verification_asked!(frame.to_s, current_user.id)
end end
self.deliver_emails = true # turn on email delivery for epp
errors.empty? && super(at) errors.empty? && super(at)
end end
@ -511,7 +509,7 @@ class Epp::Domain < Domain
preclean_pendings preclean_pendings
statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION) statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION)
statuses.delete(DomainStatus::PENDING_DELETE) statuses.delete(DomainStatus::PENDING_DELETE)
DomainMailer.delete_confirmation(id, deliver_emails).deliver DomainDeleteMailer.accepted(self).deliver_now
clean_pendings! clean_pendings!
set_pending_delete! set_pending_delete!
true true

View file

@ -1,15 +1,10 @@
Tere Tere
<br><br> <br><br>
Domeeni <%= @domain.name %> kustutamise taotlus on registreerija poolt kinnitatud. Domeen <%= @domain.name %> on peatatud ja kustub registrist. Domeeni <%= @domain.name %> kustutamise taotlus on registreerija poolt kinnitatud. Domeen <%= @domain.name %> on peatatud ja kustub registrist.
<br><br> <%= render 'mailers/shared/signatures/signature.et.html' %>
Lugupidamisega<br>
Eesti Interneti Sihtasutus
<br><br>
<hr> <hr>
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Domain <%= @domain.name %> deletion is confirmed by the registrant. Domain <%= @domain.name %> is suspended and will be deleted. Domain <%= @domain.name %> deletion is confirmed by the registrant. Domain <%= @domain.name %> is suspended and will be deleted.
<br><br> <%= render 'mailers/shared/signatures/signature.en.html' %>
Best Regards,<br>
Estonian Internet Foundation

View file

@ -2,14 +2,11 @@ Tere
Domeeni <%= @domain.name %> kustutamise taotlus on registreerija poolt kinnitatud. Domeen <%= @domain.name %> on peatatud ja kustub registrist. Domeeni <%= @domain.name %> kustutamise taotlus on registreerija poolt kinnitatud. Domeen <%= @domain.name %> on peatatud ja kustub registrist.
Lugupidamisega <%= render 'mailers/shared/signatures/signature.et.text' %>
Eesti Interneti Sihtasutus
-------------------------------------- --------------------------------------
Hi, Hi,
Domain <%= @domain.name %> deletion is confirmed by the registrant. Domain <%= @domain.name %> is suspended and will be deleted. Domain <%= @domain.name %> deletion is confirmed by the registrant. Domain <%= @domain.name %> is suspended and will be deleted.
Best Regards, <%= render 'mailers/shared/signatures/signature.en.text' %>
Estonian Internet Foundation

View file

@ -1,15 +1,10 @@
Tere Tere
<br><br> <br><br>
Domeeni <%= @domain.name %> kustutamise taotlust ei kinnitatud tähtaegselt registreerija <%= @domain.registrant.name %> poolt. Domeeni <%= @domain.name %> kustutamine on sellest tulenevalt tühistatud. Domeeni <%= @domain.name %> kustutamise taotlust ei kinnitatud tähtaegselt registreerija <%= @domain.registrant.name %> poolt. Domeeni <%= @domain.name %> kustutamine on sellest tulenevalt tühistatud.
<br><br> <%= render 'mailers/shared/signatures/signature.et.html' %>
Lugupidamisega<br>
Eesti Interneti Sihtasutus
<br><br>
<hr> <hr>
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Domain <%= @domain.name %> deletion was not approved in time by the registrant <%= @domain.registrant.name %>. Thus the deletion of domain <%= @domain.name %> is cancelled. Domain <%= @domain.name %> deletion was not approved in time by the registrant <%= @domain.registrant.name %>. Thus the deletion of domain <%= @domain.name %> is cancelled.
<br><br> <%= render 'mailers/shared/signatures/signature.en.html' %>
Best Regards,<br>
Estonian Internet Foundation

View file

@ -2,14 +2,11 @@ Tere
Domeeni <%= @domain.name %> kustutamise taotlust ei kinnitatud tähtaegselt registreerija <%= @domain.registrant.name %> poolt. Domeeni <%= @domain.name %> kustutamine on sellest tulenevalt tühistatud. Domeeni <%= @domain.name %> kustutamise taotlust ei kinnitatud tähtaegselt registreerija <%= @domain.registrant.name %> poolt. Domeeni <%= @domain.name %> kustutamine on sellest tulenevalt tühistatud.
Lugupidamisega <%= render 'mailers/shared/signatures/signature.et.text' %>
Eesti Interneti Sihtasutus
-------------------------------------- --------------------------------------
Hi, Hi,
Domain <%= @domain.name %> deletion was not approved in time by the registrant <%= @domain.registrant.name %>. Thus the deletion of domain <%= @domain.name %> is cancelled. Domain <%= @domain.name %> deletion was not approved in time by the registrant <%= @domain.registrant.name %>. Thus the deletion of domain <%= @domain.name %> is cancelled.
Best Regards, <%= render 'mailers/shared/signatures/signature.en.text' %>
Estonian Internet Foundation

View file

@ -1,15 +1,10 @@
Tere Tere
<br><br> <br><br>
Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrant.name %> poolt tagasi lükatud. Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrant.name %> poolt tagasi lükatud.
<br><br> <%= render 'mailers/shared/signatures/signature.et.html' %>
Lugupidamisega<br>
Eesti Interneti Sihtasutus
<br><br>
<hr> <hr>
<br><br> <br><br>
Hi, Hi,
<br><br> <br><br>
Domain <%= @domain.name %> deletion was rejected by the registrant <%= @domain.registrant.name %>. Domain <%= @domain.name %> deletion was rejected by the registrant <%= @domain.registrant.name %>.
<br><br> <%= render 'mailers/shared/signatures/signature.en.html' %>
Best Regards,<br>
Estonian Internet Foundation

View file

@ -2,14 +2,11 @@ Tere
Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrant.name %> poolt tagasi lükatud. Domeeni <%= @domain.name %> kustutamise taotlus on registreerija <%= @domain.registrant.name %> poolt tagasi lükatud.
Lugupidamisega <%= render 'mailers/shared/signatures/signature.et.text' %>
Eesti Interneti Sihtasutus
-------------------------------------- --------------------------------------
Hi, Hi,
Domain <%= @domain.name %> deletion was rejected by the registrant <%= @domain.registrant.name %>. Domain <%= @domain.name %> deletion was rejected by the registrant <%= @domain.registrant.name %>.
Best Regards, <%= render 'mailers/shared/signatures/signature.en.text' %>
Estonian Internet Foundation

View file

@ -575,9 +575,6 @@ en:
maximum_total: 'Maximum total' maximum_total: 'Maximum total'
unimplemented_object_service: 'Unimplemented object service' unimplemented_object_service: 'Unimplemented object service'
object_status_prohibits_operation: 'Object status prohibits operation' object_status_prohibits_operation: 'Object status prohibits operation'
pending_delete_rejected_notification_subject: "Domeeni %{name} kustutamise taotlus tagasi lükatud / %{name} deletion declined"
pending_delete_expired_notification_subject: "Domeeni %{name} kustutamise taotlus on tühistatud / %{name} deletion cancelled"
delete_confirmation_subject: "Domeeni %{name} kustutatud / %{name} deleted"
whois: WHOIS whois: WHOIS
not_valid_domain_verification_title: Domain verification not available not_valid_domain_verification_title: Domain verification not available
not_valid_domain_verification_body: This could mean your verification has been expired or done already.<br><br>Please contact us if you think something is wrong. not_valid_domain_verification_body: This could mean your verification has been expired or done already.<br><br>Please contact us if you think something is wrong.

View file

@ -1,9 +1,21 @@
en: en:
domain_delete_mailer: domain_delete_mailer:
confirmation: confirmation_request:
subject: >- subject: >-
Kinnitustaotlus domeeni %{domain_name} kustutamiseks .ee registrist Kinnitustaotlus domeeni %{domain_name} kustutamiseks .ee registrist
/ Application for approval for deletion of %{domain_name} / Application for approval for deletion of %{domain_name}
accepted:
subject: >-
Domeeni %{domain} kustutatud
/ %{domain} deleted
rejected:
subject: >-
Domeeni %{domain} kustutamise taotlus tagasi lükatud
/ %{domain} deletion declined
expired:
subject: >-
Domeeni %{domain} kustutamise taotlus on tühistatud
/ %{domain} deletion cancelled
forced: forced:
subject: >- subject: >-
Domeen %{domain_name} on kustutusmenetluses Domeen %{domain_name} on kustutusmenetluses

View file

@ -0,0 +1,30 @@
require 'test_helper'
class RegistrantAreaDomainDeleteConfirmationIntegrationTest < ActionDispatch::IntegrationTest
include ActionMailer::TestHelper
setup do
@domain = domains(:shop)
ActionMailer::Base.deliveries.clear
end
def test_notifies_registrant_by_email_when_accepted
@domain.update!(registrant_verification_asked_at: Time.zone.now,
registrant_verification_token: 'test',
statuses: [DomainStatus::PENDING_DELETE_CONFIRMATION])
patch registrant_domain_delete_confirm_path(@domain, token: 'test', confirmed: true)
assert_emails 1
end
def test_notifies_registrant_by_email_when_rejected
@domain.update!(registrant_verification_asked_at: Time.zone.now,
registrant_verification_token: 'test',
statuses: [DomainStatus::PENDING_DELETE_CONFIRMATION])
patch registrant_domain_delete_confirm_path(@domain, token: 'test', rejected: true)
assert_emails 1
end
end

View file

@ -12,13 +12,13 @@ class DomainDeleteMailerTest < ActiveSupport::TestCase
assert_equal %w[private_person legal_person], DomainDeleteMailer.force_delete_templates assert_equal %w[private_person legal_person], DomainDeleteMailer.force_delete_templates
end end
def test_delivers_domain_delete_confirmation_email def test_delivers_confirmation_request_email
assert_equal 'shop.test', @domain.name assert_equal 'shop.test', @domain.name
assert_equal 'john@inbox.test', @domain.registrant.email assert_equal 'john@inbox.test', @domain.registrant.email
email = DomainDeleteMailer.confirmation(domain: @domain, email = DomainDeleteMailer.confirmation_request(domain: @domain,
registrar: @domain.registrar, registrar: @domain.registrar,
registrant: @domain.registrant).deliver_now registrant: @domain.registrant).deliver_now
assert_emails 1 assert_emails 1
assert_equal ['john@inbox.test'], email.to assert_equal ['john@inbox.test'], email.to
@ -26,6 +26,42 @@ class DomainDeleteMailerTest < ActiveSupport::TestCase
' / Application for approval for deletion of shop.test', email.subject ' / Application for approval for deletion of shop.test', email.subject
end end
def test_delivers_accepted_email
assert_equal 'shop.test', @domain.name
assert_equal 'john@inbox.test', @domain.registrant.email
email = DomainDeleteMailer.accepted(@domain).deliver_now
assert_emails 1
assert_equal ['john@inbox.test'], email.to
assert_equal 'Domeeni shop.test kustutatud' \
' / shop.test deleted', email.subject
end
def test_delivers_rejected_email
assert_equal 'shop.test', @domain.name
assert_equal 'john@inbox.test', @domain.registrant.email
email = DomainDeleteMailer.rejected(@domain).deliver_now
assert_emails 1
assert_equal ['john@inbox.test'], email.to
assert_equal 'Domeeni shop.test kustutamise taotlus tagasi lükatud' \
' / shop.test deletion declined', email.subject
end
def test_delivers_expired_email
assert_equal 'shop.test', @domain.name
assert_equal 'john@inbox.test', @domain.registrant.email
email = DomainDeleteMailer.expired(@domain).deliver_now
assert_emails 1
assert_equal ['john@inbox.test'], email.to
assert_equal 'Domeeni shop.test kustutamise taotlus on tühistatud' \
' / shop.test deletion cancelled', email.subject
end
def test_delivers_domain_force_delete_email def test_delivers_domain_force_delete_email
assert_equal 'shop.test', @domain.name assert_equal 'shop.test', @domain.name
assert_equal 'john@inbox.test', @domain.registrant.email assert_equal 'john@inbox.test', @domain.registrant.email

View file

@ -2,10 +2,9 @@ class DomainDeleteMailerPreview < ActionMailer::Preview
def self.define_forced_templates def self.define_forced_templates
DomainDeleteMailer.force_delete_templates.each do |template_name| DomainDeleteMailer.force_delete_templates.each do |template_name|
define_method "forced_#{template_name}".to_sym do define_method "forced_#{template_name}".to_sym do
domain = Domain.first DomainDeleteMailer.forced(domain: @domain,
DomainDeleteMailer.forced(domain: domain, registrar: @domain.registrar,
registrar: domain.registrar, registrant: @domain.registrant,
registrant: domain.registrant,
template_name: template_name) template_name: template_name)
end end
end end
@ -13,10 +12,26 @@ class DomainDeleteMailerPreview < ActionMailer::Preview
define_forced_templates define_forced_templates
def confirmation def initialize
domain = Domain.first @domain = Domain.first
DomainDeleteMailer.confirmation(domain: domain, super
registrar: domain.registrar, end
registrant: domain.registrant)
def confirmation_request
DomainDeleteMailer.confirmation_request(domain: @domain,
registrar: @domain.registrar,
registrant: @domain.registrant)
end
def accepted
DomainDeleteMailer.accepted(@domain)
end
def rejected
DomainDeleteMailer.rejected(@domain)
end
def expired
DomainDeleteMailer.expired(@domain)
end end
end end

View file

@ -0,0 +1,21 @@
require 'test_helper'
class DomainCronTest < ActiveSupport::TestCase
include ActionMailer::TestHelper
setup do
@domain = domains(:shop)
ActionMailer::Base.deliveries.clear
end
def test_clean_expired_pendings_notifies_registrant_by_email
Setting.expire_pending_confirmation = 0
@domain.update!(registrant_verification_asked_at: Time.zone.now,
registrant_verification_token: 'test',
statuses: [DomainStatus::PENDING_DELETE_CONFIRMATION])
DomainCron.clean_expired_pendings
assert_emails 1
end
end