diff --git a/app/controllers/admin/domains/force_delete_controller.rb b/app/controllers/admin/domains/force_delete_controller.rb index ca5588964..9f660ed71 100644 --- a/app/controllers/admin/domains/force_delete_controller.rb +++ b/app/controllers/admin/domains/force_delete_controller.rb @@ -5,29 +5,12 @@ module Admin authorize! :manage, domain domain.transaction do - # domain.schedule_force_delete(type: force_delete_type) - # domain.registrar.notifications.create!(text: t('force_delete_set_on_domain', - # domain_name: domain.name, - # outzone_date: domain.outzone_date, - # purge_date: domain.purge_date)) # added to interactor - # - # notify_by_email if notify_by_email? # added to interactor - Domain::ForceDelete::Base.call(domain: domain, type: force_delete_type) + domain.schedule_force_delete(type: force_delete_type, notify_by_email: notify_by_email?) end redirect_to edit_admin_domain_url(domain), notice: t('.scheduled') end - def notify_by_email - # added to interactor - if force_delete_type == :fast_track - send_email - domain.update(contact_notification_sent_date: Time.zone.today) - else - domain.update(template_name: domain.notification_template) - end - end - def destroy authorize! :manage, domain domain.cancel_force_delete @@ -41,18 +24,9 @@ module Admin end def notify_by_email? - # added to interactor ActiveRecord::Type::Boolean.new.cast(params[:notify_by_email]) end - def send_email - # added to interactor - DomainDeleteMailer.forced(domain: domain, - registrar: domain.registrar, - registrant: domain.registrant, - template_name: domain.notification_template).deliver_now - end - def force_delete_type soft_delete? ? :soft : :fast_track end diff --git a/app/interactors/domain/force_delete/base.rb b/app/interactors/domain/force_delete/base.rb deleted file mode 100644 index 79de3cf2f..000000000 --- a/app/interactors/domain/force_delete/base.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Domain - module ForceDelete - class Base - include Interactor::Organizer - - # As per https://github.com/collectiveidea/interactor#organizers - - organize Domain::ForceDelete::CheckDiscarded, - Domain::ForceDelete::PrepareDomain, - Domain::ForceDelete::SetStatus, - Domain::ForceDelete::PostSetProcess, - Domain::ForceDelete::NotifyRegistrar, - Domain::ForceDelete::NotifyByEmail - end - end -end diff --git a/app/interactors/domain/force_delete/notify_by_email.rb b/app/interactors/domain/force_delete/notify_by_email.rb deleted file mode 100644 index 949dd5838..000000000 --- a/app/interactors/domain/force_delete/notify_by_email.rb +++ /dev/null @@ -1,31 +0,0 @@ -class Domain - module ForceDelete - class NotifyByEmail - include Interactor - - def call - return unless notify_by_email? - - if context.type == :fast_track - send_email - context.domain.update(contact_notification_sent_date: Time.zone.today) - else - context.domain.update(template_name: context.domain.notification_template) - end - end - - private - - def notify_by_email? - ActiveRecord::Type::Boolean.new.cast(params[:notify_by_email]) - end - - def send_email - DomainDeleteMailer.forced(domain: context.domain, - registrar: context.domain.registrar, - registrant: context.domain.registrant, - template_name: context.domain.notification_template).deliver_now - end - end - end -end diff --git a/app/interactors/domain/force_delete/notify_registrar.rb b/app/interactors/domain/force_delete/notify_registrar.rb deleted file mode 100644 index 345f4d7eb..000000000 --- a/app/interactors/domain/force_delete/notify_registrar.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Domain - module ForceDelete - class NotifyRegistrar - include Interactor - - def call - domain = context.domain - - domain.registrar.notifications.create!(text: t('force_delete_set_on_domain', - domain_name: domain.name, - outzone_date: domain.outzone_date, - purge_date: domain.purge_date)) - end - end - end -end diff --git a/app/interactors/domain/force_delete_interactor/base.rb b/app/interactors/domain/force_delete_interactor/base.rb new file mode 100644 index 000000000..d10edcaef --- /dev/null +++ b/app/interactors/domain/force_delete_interactor/base.rb @@ -0,0 +1,16 @@ +class Domain + module ForceDeleteInteractor + class Base + include Interactor::Organizer + + # As per https://github.com/collectiveidea/interactor#organizers + + organize Domain::ForceDeleteInteractor::CheckDiscarded, + Domain::ForceDeleteInteractor::PrepareDomain, + Domain::ForceDeleteInteractor::SetStatus, + Domain::ForceDeleteInteractor::PostSetProcess, + Domain::ForceDeleteInteractor::NotifyRegistrar, + Domain::ForceDeleteInteractor::NotifyByEmail + end + end +end diff --git a/app/interactors/domain/force_delete/check_discarded.rb b/app/interactors/domain/force_delete_interactor/check_discarded.rb similarity index 77% rename from app/interactors/domain/force_delete/check_discarded.rb rename to app/interactors/domain/force_delete_interactor/check_discarded.rb index ac2cd31b6..c340f9f43 100644 --- a/app/interactors/domain/force_delete/check_discarded.rb +++ b/app/interactors/domain/force_delete_interactor/check_discarded.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class CheckDiscarded include Interactor @@ -7,7 +7,7 @@ class Domain return unless context.domain.discarded? message = 'Force delete procedure cannot be scheduled while a domain is discarded' - context.fail!( message: message ) + context.fail!(message: message) end end end diff --git a/app/interactors/domain/force_delete_interactor/notify_by_email.rb b/app/interactors/domain/force_delete_interactor/notify_by_email.rb new file mode 100644 index 000000000..91855b839 --- /dev/null +++ b/app/interactors/domain/force_delete_interactor/notify_by_email.rb @@ -0,0 +1,31 @@ +class Domain + module ForceDeleteInteractor + class NotifyByEmail + include Interactor + + def call + return unless context.notify_by_email + + if context.type == :fast_track + send_email + domain.update(contact_notification_sent_date: Time.zone.today) + else + domain.update(template_name: context.domain.notification_template) + end + end + + private + + def domain + @domain ||= context.domain + end + + def send_email + DomainDeleteMailer.forced(domain: domain, + registrar: domain.registrar, + registrant: domain.registrant, + template_name: domain.notification_template).deliver_now + end + end + end +end diff --git a/app/interactors/domain/force_delete_interactor/notify_registrar.rb b/app/interactors/domain/force_delete_interactor/notify_registrar.rb new file mode 100644 index 000000000..bfe35d29a --- /dev/null +++ b/app/interactors/domain/force_delete_interactor/notify_registrar.rb @@ -0,0 +1,16 @@ +class Domain + module ForceDeleteInteractor + class NotifyRegistrar + include Interactor + + def call + domain = context.domain + + domain.registrar.notifications.create!(text: I18n.t('force_delete_set_on_domain', + domain_name: domain.name, + outzone_date: domain.outzone_date, + purge_date: domain.purge_date)) + end + end + end +end diff --git a/app/interactors/domain/force_delete/post_set_process.rb b/app/interactors/domain/force_delete_interactor/post_set_process.rb similarity index 95% rename from app/interactors/domain/force_delete/post_set_process.rb rename to app/interactors/domain/force_delete_interactor/post_set_process.rb index a2fc531b2..78a039d43 100644 --- a/app/interactors/domain/force_delete/post_set_process.rb +++ b/app/interactors/domain/force_delete_interactor/post_set_process.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class PostSetProcess include Interactor diff --git a/app/interactors/domain/force_delete/prepare_domain.rb b/app/interactors/domain/force_delete_interactor/prepare_domain.rb similarity index 93% rename from app/interactors/domain/force_delete/prepare_domain.rb rename to app/interactors/domain/force_delete_interactor/prepare_domain.rb index 3bc764dc8..c214a6b88 100644 --- a/app/interactors/domain/force_delete/prepare_domain.rb +++ b/app/interactors/domain/force_delete_interactor/prepare_domain.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class PrepareDomain include Interactor diff --git a/app/interactors/domain/force_delete/set_status.rb b/app/interactors/domain/force_delete_interactor/set_status.rb similarity index 61% rename from app/interactors/domain/force_delete/set_status.rb rename to app/interactors/domain/force_delete_interactor/set_status.rb index 2a6c49daa..a15b67ce2 100644 --- a/app/interactors/domain/force_delete/set_status.rb +++ b/app/interactors/domain/force_delete_interactor/set_status.rb @@ -1,5 +1,5 @@ class Domain - module ForceDelete + module ForceDeleteInteractor class SetStatus include Interactor @@ -9,23 +9,20 @@ class Domain domain.save(validate: false) end - private - def domain - @domain |= context.domain + @domain ||= context.domain end def force_delete_fast_track domain.force_delete_date = Time.zone.today + - Setting.expire_warning_period.days + - Setting.redemption_grace_period.days + - 1.day + expire_warning_period_days + + redemption_grace_period_days domain.force_delete_start = Time.zone.today + 1.day end def force_delete_soft - years = (valid_to.to_date - Time.zone.today).to_i / 365 - soft_forcedelete_dates(years) + years = (domain.valid_to.to_date - Time.zone.today).to_i / 365 + soft_forcedelete_dates(years) if years.positive? end def soft_forcedelete_dates(years) @@ -34,6 +31,16 @@ class Domain Setting.expire_warning_period.days + Setting.redemption_grace_period.days end + + private + + def redemption_grace_period_days + Setting.redemption_grace_period.days + 1.day + end + + def expire_warning_period_days + Setting.expire_warning_period.days + end end end end diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index 768b1d11b..26dc62413 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -52,38 +52,10 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength force_delete_start + Setting.expire_warning_period.days <= valid_to end - def schedule_force_delete(type: :fast_track) - # added to interactor - if discarded? - raise StandardError, 'Force delete procedure cannot be scheduled while a domain is discarded' - end - - type == :fast_track ? force_delete_fast_track : force_delete_soft - end - - def add_force_delete_type(force_delete_type) - self.force_delete_type = force_delete_type - end - - def force_delete_fast_track - preserve_current_statuses_for_force_delete - add_force_delete_statuses - add_force_delete_type(:fast) - self.force_delete_date = force_delete_fast_track_start_date + 1.day # added to interactor - self.force_delete_start = Time.zone.today + 1.day # added to interactor - stop_all_pending_actions - allow_deletion - save(validate: false) - end - - def force_delete_soft - preserve_current_statuses_for_force_delete - add_force_delete_statuses - add_force_delete_type(:soft) - calculate_soft_delete_date - stop_all_pending_actions - allow_deletion - save(validate: false) + def schedule_force_delete(type: :fast_track, notify_by_email: false) + Domain::ForceDeleteInteractor::Base.call(domain: self, + type: type, + notify_by_email: notify_by_email) end def clear_force_delete_data @@ -111,58 +83,15 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength private - def calculate_soft_delete_date - years = (valid_to.to_date - Time.zone.today).to_i / 365 - soft_delete_dates(years) if years.positive? - end - - def soft_delete_dates(years) - # added to interactor - self.force_delete_start = valid_to - years.years - self.force_delete_date = force_delete_start + Setting.expire_warning_period.days + - Setting.redemption_grace_period.days - end - - def stop_all_pending_actions - # added to interactor - statuses.delete(DomainStatus::PENDING_UPDATE) - statuses.delete(DomainStatus::PENDING_TRANSFER) - statuses.delete(DomainStatus::PENDING_RENEW) - statuses.delete(DomainStatus::PENDING_CREATE) - end - - def preserve_current_statuses_for_force_delete - # added to interactor - update(statuses_before_force_delete: statuses) - end - def restore_statuses_before_force_delete self.statuses = statuses_before_force_delete self.statuses_before_force_delete = nil end - def add_force_delete_statuses - # added to interactor - self.statuses |= [DomainStatus::FORCE_DELETE, - DomainStatus::SERVER_RENEW_PROHIBITED, - DomainStatus::SERVER_TRANSFER_PROHIBITED] - end - def remove_force_delete_statuses statuses.delete(DomainStatus::FORCE_DELETE) statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) statuses.delete(DomainStatus::CLIENT_HOLD) end - - def allow_deletion - # added to interactor - statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) - statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) - end - - def force_delete_fast_track_start_date - # added to interactor - Time.zone.today + Setting.expire_warning_period.days + Setting.redemption_grace_period.days - end end diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index f0723c326..f5c7e7b06 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -111,9 +111,10 @@ class NewDomainForceDeleteTest < ActiveSupport::TestCase def test_force_delete_cannot_be_scheduled_when_a_domain_is_discarded @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - assert_raises StandardError do - @domain.schedule_force_delete(type: :fast_track) - end + context = Domain::ForceDeleteInteractor::Base.call(domain: @domain, type: :fast_track) + + assert_not context.success? + assert_equal 'Force delete procedure cannot be scheduled while a domain is discarded', context.message end def test_cancels_force_delete diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 4a9240f57..bb4dd37cf 100644 --- a/test/models/domain_test.rb +++ b/test/models/domain_test.rb @@ -414,7 +414,7 @@ class DomainTest < ActiveSupport::TestCase force_delete_date: nil) @domain.update(template_name: 'legal_person') travel_to Time.zone.parse('2010-07-05') - @domain.schedule_force_delete(type: :fast_track) + Domain::ForceDeleteInteractor::Base.call(domain: @domain, type: :fast_track) assert(@domain.force_delete_scheduled?) other_registrant = Registrant.find_by(code: 'jane-001') @domain.pending_json['new_registrant_id'] = other_registrant.id