diff --git a/app/interactions/domains/force_delete/notify_multiyears_expiration_domain.rb b/app/interactions/domains/force_delete/notify_multiyears_expiration_domain.rb new file mode 100644 index 0000000000..0a0ba8107b --- /dev/null +++ b/app/interactions/domains/force_delete/notify_multiyears_expiration_domain.rb @@ -0,0 +1,44 @@ +module Domains + module ForceDelete + class NotifyMultiyearsExpirationDomain < Base + SCHEDULED_DATA = 2.days + MULTIYEAR_VALUE_START_LIMIT = 1.year + + def execute + return unless multiyear_registrations? + + recipients.each do |recipient| + DomainExpireEmailJob.set(wait_until: send_time).perform_later(domain.id, recipient) + end + end + + def send_time + domain.force_delete_start + SCHEDULED_DATA + end + + def multiyear_registrations? + domain_expire = domain.valid_to.to_i + current_time = Time.zone.now.to_i + + (domain_expire - current_time) >= MULTIYEAR_VALUE_START_LIMIT.to_i + end + + def recipients + filter_invalid_emails(domain.expired_domain_contact_emails) + end + + def filter_invalid_emails(emails) + emails.select do |email| + valid = Rails.env.test? ? true : Truemail.valid?(email) + + unless valid + Rails.logger.info('Unable to send DomainExpireMailer#expired email for '\ + "domain #{domain.name} (##{domain.id}) to invalid recipient #{email}") + end + + valid + end + end + end + end +end diff --git a/app/interactions/domains/force_delete/set_force_delete.rb b/app/interactions/domains/force_delete/set_force_delete.rb index d5f3aa871f..f7cde0cc38 100644 --- a/app/interactions/domains/force_delete/set_force_delete.rb +++ b/app/interactions/domains/force_delete/set_force_delete.rb @@ -8,6 +8,7 @@ def execute compose(PostSetProcess, inputs.to_h) compose(NotifyRegistrar, inputs.to_h) compose(NotifyByEmail, inputs.to_h) + compose(NotifyMultiyearsExpirationDomain, inputs.to_h) end end end diff --git a/app/jobs/domain_expire_email_job.rb b/app/jobs/domain_expire_email_job.rb index 11bd410477..a6d6f5909d 100644 --- a/app/jobs/domain_expire_email_job.rb +++ b/app/jobs/domain_expire_email_job.rb @@ -3,7 +3,7 @@ def perform(domain_id, email) domain = Domain.find_by(id: domain_id) return if domain.blank? - return if domain.registered? + return if domain.registered? && !domain.force_delete_scheduled? attrs = { domain: domain, diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index c333b12df7..2aeca4dd03 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -516,6 +516,21 @@ def test_lifts_force_delete_after_bounce_changes assert_not @domain.force_delete_scheduled? end + def test_notification_multiyear_expiration_domain + @domain.update(valid_to: Time.zone.parse('2014-08-05')) + assert_not @domain.force_delete_scheduled? + travel_to Time.zone.parse('2010-07-05') + + @domain.schedule_force_delete(type: :soft) + @domain.reload + + assert @domain.force_delete_scheduled? + assert_equal Date.parse('2010-09-19'), @domain.force_delete_date.to_date + assert_equal Date.parse('2010-08-05'), @domain.force_delete_start.to_date + + assert_enqueued_jobs 8 + end + def prepare_bounced_email_address(email) @bounced_mail = BouncedMailAddress.new @bounced_mail.email = email diff --git a/test/models/epp/response/result/code_test.rb b/test/models/epp/response/result/code_test.rb index 8e424aa70c..80c682ecd4 100644 --- a/test/models/epp/response/result/code_test.rb +++ b/test/models/epp/response/result/code_test.rb @@ -92,7 +92,6 @@ def test_returns_default_descriptions 2400 => 'Command failed', 2501 => 'Authentication error; server closing connection' } - assert Epp::Response::Result::Code.default_descriptions.contain? descriptions end