diff --git a/Gemfile b/Gemfile index c4f5a7cf8..d35238fc0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,9 +1,8 @@ source 'https://rubygems.org' # core +gem 'active_interaction', '~> 3.8' gem 'bootsnap', '>= 1.1.0', require: false -gem 'interactor', '~> 3.0' -gem 'interactor-rails', '~> 2.0' gem 'iso8601', '0.12.1' # for dates and times gem 'rails', '~> 6.0' gem 'rest-client' diff --git a/Gemfile.lock b/Gemfile.lock index cc59a8f41..14970c2c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -112,6 +112,8 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) + active_interaction (3.8.3) + activemodel (>= 4, < 7) activejob (6.0.3.3) activesupport (= 6.0.3.3) globalid (>= 0.3.6) @@ -251,10 +253,6 @@ GEM i18n (1.8.5) concurrent-ruby (~> 1.0) i18n_data (0.10.0) - interactor (3.1.2) - interactor-rails (2.2.1) - interactor (~> 3.0) - rails (>= 4.2) isikukood (0.1.2) iso8601 (0.12.1) jquery-rails (4.4.0) @@ -525,6 +523,7 @@ PLATFORMS ruby DEPENDENCIES + active_interaction (~> 3.8) activerecord-import airbrake bootsnap (>= 1.1.0) @@ -548,8 +547,6 @@ DEPENDENCIES figaro (= 1.1.1) grape haml (~> 5.0) - interactor (~> 3.0) - interactor-rails (~> 2.0) isikukood iso8601 (= 0.12.1) jquery-rails diff --git a/app/controllers/admin/domains/force_delete_controller.rb b/app/controllers/admin/domains/force_delete_controller.rb index 9f660ed71..4fe85fa3b 100644 --- a/app/controllers/admin/domains/force_delete_controller.rb +++ b/app/controllers/admin/domains/force_delete_controller.rb @@ -4,11 +4,15 @@ module Admin def create authorize! :manage, domain + notice = t('.scheduled') + domain.transaction do - domain.schedule_force_delete(type: force_delete_type, notify_by_email: notify_by_email?) + result = domain.schedule_force_delete(type: force_delete_type, + notify_by_email: notify_by_email?) + notice = result.errors.messages[:domain].first unless result.valid? end - redirect_to edit_admin_domain_url(domain), notice: t('.scheduled') + redirect_to edit_admin_domain_url(domain), notice: notice end def destroy diff --git a/app/interactions/domain/force_delete_interaction/base.rb b/app/interactions/domain/force_delete_interaction/base.rb new file mode 100644 index 000000000..e8079982b --- /dev/null +++ b/app/interactions/domain/force_delete_interaction/base.rb @@ -0,0 +1,17 @@ +class Domain + module ForceDeleteInteraction + class Base < ActiveInteraction::Base + object :domain, + class: Domain, + description: 'Domain to set ForceDelete on' + symbol :type, + default: :fast_track, + description: 'Force delete type, might be :fast_track or :soft' + boolean :notify_by_email, + default: false, + description: 'Do we need to send email notification' + + validates :type, inclusion: { in: %i[fast_track soft] } + end + end +end diff --git a/app/interactors/domain/force_delete_interactor/check_discarded.rb b/app/interactions/domain/force_delete_interaction/check_discarded.rb similarity index 55% rename from app/interactors/domain/force_delete_interactor/check_discarded.rb rename to app/interactions/domain/force_delete_interaction/check_discarded.rb index b63828f49..d2b54641a 100644 --- a/app/interactors/domain/force_delete_interactor/check_discarded.rb +++ b/app/interactions/domain/force_delete_interaction/check_discarded.rb @@ -1,11 +1,11 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class CheckDiscarded < Base - def call - return unless domain.discarded? + def execute + return true unless domain.discarded? message = 'Force delete procedure cannot be scheduled while a domain is discarded' - context.fail!(message: message) + errors.add(:domain, message) end end end diff --git a/app/interactors/domain/force_delete_interactor/notify_by_email.rb b/app/interactions/domain/force_delete_interaction/notify_by_email.rb similarity index 70% rename from app/interactors/domain/force_delete_interactor/notify_by_email.rb rename to app/interactions/domain/force_delete_interaction/notify_by_email.rb index 5263fdd7a..97abc8e5c 100644 --- a/app/interactors/domain/force_delete_interactor/notify_by_email.rb +++ b/app/interactions/domain/force_delete_interaction/notify_by_email.rb @@ -1,14 +1,14 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class NotifyByEmail < Base - def call - return unless context.notify_by_email + def execute + return unless notify_by_email - if context.type == :fast_track + if type == :fast_track send_email domain.update(contact_notification_sent_date: Time.zone.today) else - domain.update(template_name: context.domain.notification_template) + domain.update(template_name: domain.notification_template) end end diff --git a/app/interactors/domain/force_delete_interactor/notify_registrar.rb b/app/interactions/domain/force_delete_interaction/notify_registrar.rb similarity index 89% rename from app/interactors/domain/force_delete_interactor/notify_registrar.rb rename to app/interactions/domain/force_delete_interaction/notify_registrar.rb index bd891d5dc..da3e400cc 100644 --- a/app/interactors/domain/force_delete_interactor/notify_registrar.rb +++ b/app/interactions/domain/force_delete_interaction/notify_registrar.rb @@ -1,7 +1,7 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class NotifyRegistrar < Base - def call + def execute domain.registrar.notifications.create!(text: I18n.t('force_delete_set_on_domain', domain_name: domain.name, outzone_date: domain.outzone_date, diff --git a/app/interactors/domain/force_delete_interactor/post_set_process.rb b/app/interactions/domain/force_delete_interaction/post_set_process.rb similarity index 91% rename from app/interactors/domain/force_delete_interactor/post_set_process.rb rename to app/interactions/domain/force_delete_interaction/post_set_process.rb index 4017eb459..68eb59bf9 100644 --- a/app/interactors/domain/force_delete_interactor/post_set_process.rb +++ b/app/interactions/domain/force_delete_interaction/post_set_process.rb @@ -1,7 +1,7 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class PostSetProcess < Base - def call + def execute statuses = domain.statuses # Stop all pending actions statuses.delete(DomainStatus::PENDING_UPDATE) diff --git a/app/interactors/domain/force_delete_interactor/prepare_domain.rb b/app/interactions/domain/force_delete_interaction/prepare_domain.rb similarity index 89% rename from app/interactors/domain/force_delete_interactor/prepare_domain.rb rename to app/interactions/domain/force_delete_interaction/prepare_domain.rb index 6317bbaf1..fddfeb75a 100644 --- a/app/interactors/domain/force_delete_interactor/prepare_domain.rb +++ b/app/interactions/domain/force_delete_interaction/prepare_domain.rb @@ -1,11 +1,11 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class PrepareDomain < Base STATUSES_TO_SET = [DomainStatus::FORCE_DELETE, DomainStatus::SERVER_RENEW_PROHIBITED, DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze - def call + def execute domain.statuses_before_force_delete = domain.statuses domain.statuses |= STATUSES_TO_SET domain.save(validate: false) diff --git a/app/interactions/domain/force_delete_interaction/set_force_delete.rb b/app/interactions/domain/force_delete_interaction/set_force_delete.rb new file mode 100644 index 000000000..6bbd8ef20 --- /dev/null +++ b/app/interactions/domain/force_delete_interaction/set_force_delete.rb @@ -0,0 +1,14 @@ +class Domain + module ForceDeleteInteraction + class SetForceDelete < Base + def execute + compose(CheckDiscarded, inputs) + compose(PrepareDomain, inputs) + compose(SetStatus, inputs) + compose(PostSetProcess, inputs) + compose(NotifyRegistrar, inputs) + compose(NotifyByEmail, inputs) + end + end + end +end diff --git a/app/interactors/domain/force_delete_interactor/set_status.rb b/app/interactions/domain/force_delete_interaction/set_status.rb similarity index 86% rename from app/interactors/domain/force_delete_interactor/set_status.rb rename to app/interactions/domain/force_delete_interaction/set_status.rb index 418952f51..a56069fcc 100644 --- a/app/interactors/domain/force_delete_interactor/set_status.rb +++ b/app/interactions/domain/force_delete_interaction/set_status.rb @@ -1,9 +1,9 @@ class Domain - module ForceDeleteInteractor + module ForceDeleteInteraction class SetStatus < Base - def call - domain.force_delete_type = context.type - context.type == :fast_track ? force_delete_fast_track : force_delete_soft + def execute + domain.force_delete_type = type + type == :fast_track ? force_delete_fast_track : force_delete_soft domain.save(validate: false) end @@ -19,6 +19,8 @@ class Domain soft_forcedelete_dates(years) if years.positive? end + private + def soft_forcedelete_dates(years) domain.force_delete_start = domain.valid_to - years.years domain.force_delete_date = domain.force_delete_start + @@ -26,8 +28,6 @@ class Domain Setting.redemption_grace_period.days end - private - def redemption_grace_period_days Setting.redemption_grace_period.days + 1.day end diff --git a/app/interactors/domain/force_delete_interactor/base.rb b/app/interactors/domain/force_delete_interactor/base.rb deleted file mode 100644 index 6724d53e3..000000000 --- a/app/interactors/domain/force_delete_interactor/base.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Domain - module ForceDeleteInteractor - class Base - include Interactor - - private - - def domain - @domain ||= context.domain - end - end - end -end diff --git a/app/interactors/domain/force_delete_interactor/set_force_delete.rb b/app/interactors/domain/force_delete_interactor/set_force_delete.rb deleted file mode 100644 index 4435b8f8c..000000000 --- a/app/interactors/domain/force_delete_interactor/set_force_delete.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Domain - module ForceDeleteInteractor - class SetForceDelete - 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/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index 4a032ab36..f81669c74 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -53,7 +53,7 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength end def schedule_force_delete(type: :fast_track, notify_by_email: false) - Domain::ForceDeleteInteractor::SetForceDelete.call(domain: self, + Domain::ForceDeleteInteraction::SetForceDelete.run(domain: self, type: type, notify_by_email: notify_by_email) end diff --git a/config/application.rb b/config/application.rb index 5f4481512..a5fb17c9d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -36,6 +36,7 @@ module DomainNameRegistry # Autoload all model subdirs config.autoload_paths += Dir[Rails.root.join('app', 'models', '**/')] + config.autoload_paths += Dir[Rails.root.join('app', 'interactions', '**/')] config.eager_load_paths << config.root.join('lib', 'validators') config.watchable_dirs['lib'] = %i[rb] diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index ddd330f47..b57763342 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -111,10 +111,12 @@ class NewDomainForceDeleteTest < ActiveSupport::TestCase def test_force_delete_cannot_be_scheduled_when_a_domain_is_discarded @domain.update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - context = Domain::ForceDeleteInteractor::SetForceDelete.call(domain: @domain, type: :fast_track) + result = Domain::ForceDeleteInteraction::SetForceDelete.run(domain: @domain, type: :fast_track) - assert_not context.success? - assert_equal 'Force delete procedure cannot be scheduled while a domain is discarded', context.message + assert_not result.valid? + assert_not @domain.force_delete_scheduled? + message = ["Force delete procedure cannot be scheduled while a domain is discarded"] + assert_equal message, result.errors.messages[:domain] end def test_cancels_force_delete diff --git a/test/models/domain_test.rb b/test/models/domain_test.rb index 2b01c795f..514efaf14 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::ForceDeleteInteractor::SetForceDelete.call(domain: @domain, type: :fast_track) + Domain::ForceDeleteInteraction::SetForceDelete.run!(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