From a40116e05e5e80378ef99f861ec824c020ffd276 Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Fri, 20 Nov 2020 16:51:05 +0500 Subject: [PATCH 1/2] Move ClientHold procedure to interactor Closes #1751 --- .../client_hold_interaction/base.rb | 8 +++ .../process_client_hold.rb | 67 +++++++++++++++++++ .../set_client_hold.rb | 15 +++++ app/models/concerns/domain/force_delete.rb | 19 ------ app/models/concerns/job/force_delete.rb | 34 ---------- .../concerns/job/force_delete_logging.rb | 34 ---------- .../concerns/job/force_delete_notify.rb | 31 --------- app/models/domain_cron.rb | 8 +-- test/models/domain/force_delete_test.rb | 13 ++-- 9 files changed, 102 insertions(+), 127 deletions(-) create mode 100644 app/interactions/client_hold_interaction/base.rb create mode 100644 app/interactions/client_hold_interaction/process_client_hold.rb create mode 100644 app/interactions/client_hold_interaction/set_client_hold.rb delete mode 100644 app/models/concerns/job/force_delete.rb delete mode 100644 app/models/concerns/job/force_delete_logging.rb delete mode 100644 app/models/concerns/job/force_delete_notify.rb diff --git a/app/interactions/client_hold_interaction/base.rb b/app/interactions/client_hold_interaction/base.rb new file mode 100644 index 000000000..be8b8b0a8 --- /dev/null +++ b/app/interactions/client_hold_interaction/base.rb @@ -0,0 +1,8 @@ +module ClientHoldInteraction + class Base < ActiveInteraction::Base + def to_stdout(message) + time = Time.zone.now.utc + STDOUT << "#{time} - #{message}\n" unless Rails.env.test? + end + end +end diff --git a/app/interactions/client_hold_interaction/process_client_hold.rb b/app/interactions/client_hold_interaction/process_client_hold.rb new file mode 100644 index 000000000..453c400cc --- /dev/null +++ b/app/interactions/client_hold_interaction/process_client_hold.rb @@ -0,0 +1,67 @@ +module ClientHoldInteraction + class ProcessClientHold < Base + object :domain, + class: Domain, + description: 'Domain to set ClientHold on' + + # rubocop:disable Metrics/AbcSize + def execute + notify_on_grace_period if should_notify_on_soft_force_delete? + + return unless client_holdable? + + domain.statuses << DomainStatus::CLIENT_HOLD + to_stdout("DomainCron.start_client_hold: #{domain.id} (#{domain.name}) #{domain.changes}\n") + + domain.save(validate: false) + notify_client_hold + + to_stdout("Successfully set client_hold on (#{domain.name})") + end + + def notify_on_grace_period + domain.registrar.notifications.create!(text: I18n.t('grace_period_started_domain', + domain_name: domain.name, + date: domain.force_delete_start)) + send_mail if domain.template_name.present? + domain.update(contact_notification_sent_date: Time.zone.today) + end + + def notify_client_hold + 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 + + def send_mail + DomainDeleteMailer.forced(domain: domain, + registrar: domain.registrar, + registrant: domain.registrant, + template_name: domain.template_name).deliver_now + end + + def should_notify_on_soft_force_delete? + domain.force_delete_scheduled? && domain.contact_notification_sent_date.blank? && + domain.force_delete_start.to_date <= Time.zone.now.to_date && + domain.force_delete_type.to_sym == :soft && + !domain.statuses.include?(DomainStatus::CLIENT_HOLD) + end + # rubocop:enable Metrics/AbcSize + + def client_holdable? + domain.force_delete_scheduled? && + !domain.statuses.include?(DomainStatus::CLIENT_HOLD) && + domain.force_delete_start.present? && + force_delete_lte_today && force_delete_lte_valid_date + end + + def force_delete_lte_today + domain.force_delete_start + Setting.expire_warning_period.days <= Time.zone.now + end + + def force_delete_lte_valid_date + domain.force_delete_start + Setting.expire_warning_period.days <= domain.valid_to + end + end +end diff --git a/app/interactions/client_hold_interaction/set_client_hold.rb b/app/interactions/client_hold_interaction/set_client_hold.rb new file mode 100644 index 000000000..d723d5cc8 --- /dev/null +++ b/app/interactions/client_hold_interaction/set_client_hold.rb @@ -0,0 +1,15 @@ +module ClientHoldInteraction + class SetClientHold < Base + def execute + to_stdout('Setting client_hold to domains\n') + + ::PaperTrail.request.whodunnit = "cron - #{self.class.name}" + + ::Domain.force_delete_scheduled.each do |domain| + ClientHoldInteraction::ProcessClientHold.run(domain: domain) + end + + to_stdout('All client_hold setting are done\n') + end + end +end diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index ff869fc0a..988c8075a 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -33,25 +33,6 @@ module Concerns::Domain::ForceDelete # rubocop:disable Metrics/ModuleLength statuses.include?(DomainStatus::FORCE_DELETE) end - def should_notify_on_soft_force_delete? - force_delete_scheduled? && contact_notification_sent_date.blank? && - force_delete_start.to_date <= Time.zone.now.to_date && force_delete_type.to_sym == :soft && - !statuses.include?(DomainStatus::CLIENT_HOLD) - end - - def client_holdable? - force_delete_scheduled? && !statuses.include?(DomainStatus::CLIENT_HOLD) && - force_delete_start.present? && force_delete_lte_today && force_delete_lte_valid_date - end - - def force_delete_lte_today - force_delete_start + Setting.expire_warning_period.days <= Time.zone.now - end - - def force_delete_lte_valid_date - force_delete_start + Setting.expire_warning_period.days <= valid_to - end - def schedule_force_delete(type: :fast_track, notify_by_email: false) ForceDeleteInteraction::SetForceDelete.run(domain: self, type: type, diff --git a/app/models/concerns/job/force_delete.rb b/app/models/concerns/job/force_delete.rb deleted file mode 100644 index 316612d1e..000000000 --- a/app/models/concerns/job/force_delete.rb +++ /dev/null @@ -1,34 +0,0 @@ -module Concerns - module Job - module ForceDelete - extend ActiveSupport::Concern - - class_methods do - def start_client_hold - log_prepare_client_hold - - ::PaperTrail.request.whodunnit = "cron - #{__method__}" - - ::Domain.force_delete_scheduled.each do |domain| - proceed_client_hold(domain: domain) - end - - log_end_end_force_delete_job - end - - def proceed_client_hold(domain:) - notify_on_grace_period(domain) if domain.should_notify_on_soft_force_delete? - return unless domain.client_holdable? - - domain.statuses << DomainStatus::CLIENT_HOLD - log_start_client_hold(domain) - - domain.save(validate: false) - notify_client_hold(domain) - - log_end_end_client_hold(domain) - end - end - end - end -end diff --git a/app/models/concerns/job/force_delete_logging.rb b/app/models/concerns/job/force_delete_logging.rb deleted file mode 100644 index 8f6ee227c..000000000 --- a/app/models/concerns/job/force_delete_logging.rb +++ /dev/null @@ -1,34 +0,0 @@ -module Concerns - module Job - module ForceDeleteLogging - extend ActiveSupport::Concern - - class_methods do - def log_prepare_client_hold - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} - Setting client_hold to domains\n" - end - - def log_start_client_hold(domain) - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} DomainCron.start_client_hold: ##{domain.id} "\ - "(#{domain.name}) #{domain.changes}\n" - end - - def log_end_end_client_hold(domain) - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} - Successfully set client_hold on (#{domain.name})" - end - - def log_end_end_force_delete_job - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} - All client_hold setting are done\n" - end - end - end - end -end diff --git a/app/models/concerns/job/force_delete_notify.rb b/app/models/concerns/job/force_delete_notify.rb deleted file mode 100644 index bc291354e..000000000 --- a/app/models/concerns/job/force_delete_notify.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Concerns - module Job - module ForceDeleteNotify - extend ActiveSupport::Concern - - class_methods do - def notify_client_hold(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 - - def notify_on_grace_period(domain) - domain.registrar.notifications.create!(text: I18n.t('grace_period_started_domain', - domain_name: domain.name, - date: domain.force_delete_start)) - send_mail(domain) if domain.template_name.present? - domain.update(contact_notification_sent_date: Time.zone.today) - end - - def send_mail(domain) - DomainDeleteMailer.forced(domain: domain, - registrar: domain.registrar, - registrant: domain.registrant, - template_name: domain.template_name).deliver_now - end - end - end - end -end diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index ad64456ca..613762062 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -1,8 +1,4 @@ class DomainCron - include Concerns::Job::ForceDelete - include Concerns::Job::ForceDeleteLogging - include Concerns::Job::ForceDeleteNotify - def self.clean_expired_pendings STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test? @@ -81,4 +77,8 @@ class DomainCron STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{marked} of #{real} domains\n" unless Rails.env.test? marked end + + def self.start_client_hold + ClientHoldInteraction::SetClientHold.run! + end end diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index 7c205fa74..d9e7a3632 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -206,9 +206,10 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :soft) travel_to Time.zone.parse('2010-08-21') - DomainCron.start_client_hold + ClientHoldInteraction::SetClientHold.run! @domain.reload + assert_emails 1 assert_equal(@domain.purge_date.to_date, @domain.force_delete_date.to_date) assert_equal(@domain.outzone_date.to_date, @domain.force_delete_start.to_date + Setting.expire_warning_period.days) @@ -226,8 +227,10 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :soft) travel_to Time.zone.parse('2010-08-21') - DomainCron.start_client_hold + ClientHoldInteraction::SetClientHold.run! @domain.reload + + assert_emails 1 assert_includes(@domain.statuses, asserted_status) end @@ -241,7 +244,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :soft) travel_to Time.zone.parse('2010-07-06') - DomainCron.start_client_hold + ClientHoldInteraction::SetClientHold.run! @domain.reload assert_not_includes(@domain.statuses, asserted_status) @@ -256,7 +259,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :fast_track) travel_to Time.zone.parse('2010-07-25') - DomainCron.start_client_hold + ClientHoldInteraction::SetClientHold.run! @domain.reload assert_includes(@domain.statuses, asserted_status) @@ -272,7 +275,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :fast_track) travel_to Time.zone.parse('2010-07-06') - DomainCron.start_client_hold + ClientHoldInteraction::SetClientHold.run! @domain.reload assert_not_includes(@domain.statuses, asserted_status) From 8ff8aa78c8e12ae6523c3cc0ff1524b12de44d81 Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Mon, 30 Nov 2020 16:08:32 +0500 Subject: [PATCH 2/2] Move interactor to namespace --- .../client_hold_interaction/base.rb | 8 --- .../process_client_hold.rb | 67 ------------------ .../set_client_hold.rb | 15 ---- app/interactions/domains/client_hold/base.rb | 10 +++ .../client_hold/process_client_hold.rb | 69 +++++++++++++++++++ .../domains/client_hold/set_client_hold.rb | 17 +++++ app/models/domain_cron.rb | 2 +- test/models/domain/force_delete_test.rb | 10 +-- 8 files changed, 102 insertions(+), 96 deletions(-) delete mode 100644 app/interactions/client_hold_interaction/base.rb delete mode 100644 app/interactions/client_hold_interaction/process_client_hold.rb delete mode 100644 app/interactions/client_hold_interaction/set_client_hold.rb create mode 100644 app/interactions/domains/client_hold/base.rb create mode 100644 app/interactions/domains/client_hold/process_client_hold.rb create mode 100644 app/interactions/domains/client_hold/set_client_hold.rb diff --git a/app/interactions/client_hold_interaction/base.rb b/app/interactions/client_hold_interaction/base.rb deleted file mode 100644 index be8b8b0a8..000000000 --- a/app/interactions/client_hold_interaction/base.rb +++ /dev/null @@ -1,8 +0,0 @@ -module ClientHoldInteraction - class Base < ActiveInteraction::Base - def to_stdout(message) - time = Time.zone.now.utc - STDOUT << "#{time} - #{message}\n" unless Rails.env.test? - end - end -end diff --git a/app/interactions/client_hold_interaction/process_client_hold.rb b/app/interactions/client_hold_interaction/process_client_hold.rb deleted file mode 100644 index 453c400cc..000000000 --- a/app/interactions/client_hold_interaction/process_client_hold.rb +++ /dev/null @@ -1,67 +0,0 @@ -module ClientHoldInteraction - class ProcessClientHold < Base - object :domain, - class: Domain, - description: 'Domain to set ClientHold on' - - # rubocop:disable Metrics/AbcSize - def execute - notify_on_grace_period if should_notify_on_soft_force_delete? - - return unless client_holdable? - - domain.statuses << DomainStatus::CLIENT_HOLD - to_stdout("DomainCron.start_client_hold: #{domain.id} (#{domain.name}) #{domain.changes}\n") - - domain.save(validate: false) - notify_client_hold - - to_stdout("Successfully set client_hold on (#{domain.name})") - end - - def notify_on_grace_period - domain.registrar.notifications.create!(text: I18n.t('grace_period_started_domain', - domain_name: domain.name, - date: domain.force_delete_start)) - send_mail if domain.template_name.present? - domain.update(contact_notification_sent_date: Time.zone.today) - end - - def notify_client_hold - 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 - - def send_mail - DomainDeleteMailer.forced(domain: domain, - registrar: domain.registrar, - registrant: domain.registrant, - template_name: domain.template_name).deliver_now - end - - def should_notify_on_soft_force_delete? - domain.force_delete_scheduled? && domain.contact_notification_sent_date.blank? && - domain.force_delete_start.to_date <= Time.zone.now.to_date && - domain.force_delete_type.to_sym == :soft && - !domain.statuses.include?(DomainStatus::CLIENT_HOLD) - end - # rubocop:enable Metrics/AbcSize - - def client_holdable? - domain.force_delete_scheduled? && - !domain.statuses.include?(DomainStatus::CLIENT_HOLD) && - domain.force_delete_start.present? && - force_delete_lte_today && force_delete_lte_valid_date - end - - def force_delete_lte_today - domain.force_delete_start + Setting.expire_warning_period.days <= Time.zone.now - end - - def force_delete_lte_valid_date - domain.force_delete_start + Setting.expire_warning_period.days <= domain.valid_to - end - end -end diff --git a/app/interactions/client_hold_interaction/set_client_hold.rb b/app/interactions/client_hold_interaction/set_client_hold.rb deleted file mode 100644 index d723d5cc8..000000000 --- a/app/interactions/client_hold_interaction/set_client_hold.rb +++ /dev/null @@ -1,15 +0,0 @@ -module ClientHoldInteraction - class SetClientHold < Base - def execute - to_stdout('Setting client_hold to domains\n') - - ::PaperTrail.request.whodunnit = "cron - #{self.class.name}" - - ::Domain.force_delete_scheduled.each do |domain| - ClientHoldInteraction::ProcessClientHold.run(domain: domain) - end - - to_stdout('All client_hold setting are done\n') - end - end -end diff --git a/app/interactions/domains/client_hold/base.rb b/app/interactions/domains/client_hold/base.rb new file mode 100644 index 000000000..c3c626b79 --- /dev/null +++ b/app/interactions/domains/client_hold/base.rb @@ -0,0 +1,10 @@ +module Domains + module ClientHold + class Base < ActiveInteraction::Base + def to_stdout(message) + time = Time.zone.now.utc + STDOUT << "#{time} - #{message}\n" unless Rails.env.test? + end + end + end +end diff --git a/app/interactions/domains/client_hold/process_client_hold.rb b/app/interactions/domains/client_hold/process_client_hold.rb new file mode 100644 index 000000000..8b8d60403 --- /dev/null +++ b/app/interactions/domains/client_hold/process_client_hold.rb @@ -0,0 +1,69 @@ +module Domains + module ClientHold + class ProcessClientHold < Base + object :domain, + class: Domain, + description: 'Domain to set ClientHold on' + + # rubocop:disable Metrics/AbcSize + def execute + notify_on_grace_period if should_notify_on_soft_force_delete? + + return unless client_holdable? + + domain.statuses << DomainStatus::CLIENT_HOLD + to_stdout("DomainCron.start_client_hold: #{domain.id} (#{domain.name}) #{domain.changes}\n") + + domain.save(validate: false) + notify_client_hold + + to_stdout("Successfully set client_hold on (#{domain.name})") + end + + def notify_on_grace_period + domain.registrar.notifications.create!(text: I18n.t('grace_period_started_domain', + domain_name: domain.name, + date: domain.force_delete_start)) + send_mail if domain.template_name.present? + domain.update(contact_notification_sent_date: Time.zone.today) + end + + def notify_client_hold + 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 + + def send_mail + DomainDeleteMailer.forced(domain: domain, + registrar: domain.registrar, + registrant: domain.registrant, + template_name: domain.template_name).deliver_now + end + + def should_notify_on_soft_force_delete? + domain.force_delete_scheduled? && domain.contact_notification_sent_date.blank? && + domain.force_delete_start.to_date <= Time.zone.now.to_date && + domain.force_delete_type.to_sym == :soft && + !domain.statuses.include?(DomainStatus::CLIENT_HOLD) + end + # rubocop:enable Metrics/AbcSize + + def client_holdable? + domain.force_delete_scheduled? && + !domain.statuses.include?(DomainStatus::CLIENT_HOLD) && + domain.force_delete_start.present? && + force_delete_lte_today && force_delete_lte_valid_date + end + + def force_delete_lte_today + domain.force_delete_start + Setting.expire_warning_period.days <= Time.zone.now + end + + def force_delete_lte_valid_date + domain.force_delete_start + Setting.expire_warning_period.days <= domain.valid_to + end + end + end +end diff --git a/app/interactions/domains/client_hold/set_client_hold.rb b/app/interactions/domains/client_hold/set_client_hold.rb new file mode 100644 index 000000000..0e54b531f --- /dev/null +++ b/app/interactions/domains/client_hold/set_client_hold.rb @@ -0,0 +1,17 @@ +module Domains + module ClientHold + class SetClientHold < Base + def execute + to_stdout('Setting client_hold to domains\n') + + ::PaperTrail.request.whodunnit = "cron - #{self.class.name}" + + ::Domain.force_delete_scheduled.each do |domain| + Domains::ClientHold::ProcessClientHold.run(domain: domain) + end + + to_stdout('All client_hold setting are done\n') + end + end + end +end diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index 613762062..d09141d52 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -79,6 +79,6 @@ class DomainCron end def self.start_client_hold - ClientHoldInteraction::SetClientHold.run! + Domains::ClientHold::SetClientHold.run! end end diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb index d9e7a3632..304a7a18b 100644 --- a/test/models/domain/force_delete_test.rb +++ b/test/models/domain/force_delete_test.rb @@ -206,7 +206,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :soft) travel_to Time.zone.parse('2010-08-21') - ClientHoldInteraction::SetClientHold.run! + Domains::ClientHold::SetClientHold.run! @domain.reload assert_emails 1 @@ -227,7 +227,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :soft) travel_to Time.zone.parse('2010-08-21') - ClientHoldInteraction::SetClientHold.run! + Domains::ClientHold::SetClientHold.run! @domain.reload assert_emails 1 @@ -244,7 +244,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :soft) travel_to Time.zone.parse('2010-07-06') - ClientHoldInteraction::SetClientHold.run! + Domains::ClientHold::SetClientHold.run! @domain.reload assert_not_includes(@domain.statuses, asserted_status) @@ -259,7 +259,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :fast_track) travel_to Time.zone.parse('2010-07-25') - ClientHoldInteraction::SetClientHold.run! + Domains::ClientHold::SetClientHold.run! @domain.reload assert_includes(@domain.statuses, asserted_status) @@ -275,7 +275,7 @@ class ForceDeleteTest < ActionMailer::TestCase @domain.schedule_force_delete(type: :fast_track) travel_to Time.zone.parse('2010-07-06') - ClientHoldInteraction::SetClientHold.run! + Domains::ClientHold::SetClientHold.run! @domain.reload assert_not_includes(@domain.statuses, asserted_status)