diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index d09ea3704..ffe997322 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -11,6 +11,11 @@ module Concerns::Domain::ForceDelete statuses.include?(DomainStatus::FORCE_DELETE) end + def should_notify_on_soft_force_delete? + force_delete_scheduled? && !statuses.include?(DomainStatus::CLIENT_HOLD) && + force_delete_start.present? && force_delete_start.to_date == Time.zone.now.to_date + 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 diff --git a/app/models/concerns/job/force_delete.rb b/app/models/concerns/job/force_delete.rb new file mode 100644 index 000000000..727ddaa3b --- /dev/null +++ b/app/models/concerns/job/force_delete.rb @@ -0,0 +1,31 @@ +module Concerns + module Job + module ForceDelete + extend ActiveSupport::Concern + + class_methods do + def start_client_hold + log_prepare_client_hold + + ::PaperTrail.whodunnit = "cron - #{__method__}" + + ::Domain.force_delete_scheduled.each do |domain| + proceed_client_hold(domain: domain) + log_end_end_client_hold(domain) + end + 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) + end + end + end + end +end diff --git a/app/models/concerns/job/force_delete_messages.rb b/app/models/concerns/job/force_delete_messages.rb new file mode 100644 index 000000000..cb4f298a8 --- /dev/null +++ b/app/models/concerns/job/force_delete_messages.rb @@ -0,0 +1,40 @@ +module Concerns + module Job + module ForceDeleteMessages + 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 notify_client_hold(domain) + domain.registrar.notifications.create!(text: I18n.t('client_hold_set_on_domain', + domain_name: domain.name, + date: domain.force_delete_start)) + 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)) + end + end + end + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 50f41c38a..734243c0d 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -547,6 +547,8 @@ class Domain < ApplicationRecord activate if nameservers.reject(&:marked_for_destruction?).size >= Setting.ns_min_count end + cancel_force_delete if force_delete_scheduled? && pending_json['new_registrant_id'] + if statuses.empty? && valid? statuses << DomainStatus::OK elsif (statuses.length > 1 && active?) || !valid? diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index 154c4ca19..47e5a99b5 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -1,4 +1,6 @@ class DomainCron + include Concerns::Job::ForceDelete + include Concerns::Job::ForceDeleteMessages def self.clean_expired_pendings STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test? @@ -78,52 +80,4 @@ 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 - log_prepare_client_hold - - ::PaperTrail.whodunnit = "cron - #{__method__}" - - marked = 0 - real = 0 - - Domain.force_delete_scheduled.each do |domain| - next unless domain.client_holdable? - - real += 1 - domain.statuses << DomainStatus::CLIENT_HOLD - log_start_client_hold(domain) - - domain.save(validate: false) and marked += 1 and notify_client_hold(domain) - end - - log_end_end_client_hold(marked: marked, real: real) - marked - end - - def self.log_prepare_client_hold - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} - Setting client_hold to domains\n" - end - - def self.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 self.log_end_end_client_hold(marked:, real:) - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} - Successfully set client_hold to #{marked} of #{real} "\ - "domains\n" - end - - def self.notify_client_hold(domain) - domain.registrar.notifications.create!(text: I18n.t('soft_force_delete_set_on_domain', - domain_name: domain.name, - start_date: domain.force_delete_start)) - end end diff --git a/app/views/admin/domains/_force_delete_dialog.html.erb b/app/views/admin/domains/_force_delete_dialog.html.erb index 6287abffe..a76c14edd 100644 --- a/app/views/admin/domains/_force_delete_dialog.html.erb +++ b/app/views/admin/domains/_force_delete_dialog.html.erb @@ -14,8 +14,7 @@