Modify force_delete procedure to set clientHold only by job

This commit is contained in:
Alex Sherman 2019-12-16 16:50:25 +05:00
parent b9575661eb
commit a815e943d3
4 changed files with 69 additions and 13 deletions

View file

@ -1,12 +1,29 @@
module Concerns::Domain::ForceDelete module Concerns::Domain::ForceDelete
extend ActiveSupport::Concern extend ActiveSupport::Concern
DAYS_TO_START_HOLD = 15.days class_methods do
def force_delete_scheduled
where('force_delete_start <= ?', Time.zone.now)
end
end
def force_delete_scheduled? def force_delete_scheduled?
statuses.include?(DomainStatus::FORCE_DELETE) statuses.include?(DomainStatus::FORCE_DELETE)
end 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) def schedule_force_delete(type: :fast_track)
if discarded? if discarded?
raise StandardError, 'Force delete procedure cannot be scheduled while a domain is discarded' raise StandardError, 'Force delete procedure cannot be scheduled while a domain is discarded'
@ -18,7 +35,7 @@ module Concerns::Domain::ForceDelete
def force_delete_fast_track def force_delete_fast_track
preserve_current_statuses_for_force_delete preserve_current_statuses_for_force_delete
add_force_delete_statuses add_force_delete_statuses
self.force_delete_date = Time.zone.today + Setting.redemption_grace_period.days self.force_delete_date = force_delete_fast_track_start_date
self.force_delete_start = Time.zone.today self.force_delete_start = Time.zone.today
stop_all_pending_actions stop_all_pending_actions
allow_deletion allow_deletion
@ -30,7 +47,6 @@ module Concerns::Domain::ForceDelete
add_force_delete_statuses add_force_delete_statuses
calculate_soft_delete_date calculate_soft_delete_date
stop_all_pending_actions stop_all_pending_actions
check_hold
allow_deletion allow_deletion
save(validate: false) save(validate: false)
end end
@ -45,12 +61,6 @@ module Concerns::Domain::ForceDelete
private private
def check_hold
if force_delete_start.present? && force_delete_start + DAYS_TO_START_HOLD < valid_to
statuses << DomainStatus::CLIENT_HOLD
end
end
def calculate_soft_delete_date def calculate_soft_delete_date
years = (valid_to.to_date - Time.zone.today).to_i / 365 years = (valid_to.to_date - Time.zone.today).to_i / 365
soft_delete_dates(years) if years.positive? soft_delete_dates(years) if years.positive?
@ -58,7 +68,8 @@ module Concerns::Domain::ForceDelete
def soft_delete_dates(years) def soft_delete_dates(years)
self.force_delete_start = valid_to - years.years self.force_delete_start = valid_to - years.years
self.force_delete_date = force_delete_start + Setting.redemption_grace_period.days self.force_delete_date = force_delete_start + Setting.expire_warning_period.days +
Setting.redemption_grace_period.days
end end
def stop_all_pending_actions def stop_all_pending_actions
@ -94,4 +105,8 @@ module Concerns::Domain::ForceDelete
statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED)
statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED)
end end
def force_delete_fast_track_start_date
Time.zone.today + Setting.expire_warning_period.days + Setting.redemption_grace_period.days
end
end end

View file

@ -78,4 +78,46 @@ class DomainCron
STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{marked} of #{real} domains\n" unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{marked} of #{real} domains\n" unless Rails.env.test?
marked marked
end 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
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
end end

View file

@ -4337,7 +4337,7 @@ INSERT INTO "schema_migrations" (version) VALUES
('20191212133136'), ('20191212133136'),
('20191227110904'), ('20191227110904'),
('20191203083643'), ('20191203083643'),
('20191206183853'),
('20200113091254'); ('20200113091254');

View file

@ -3,7 +3,7 @@ require 'test_helper'
class NewDomainForceDeleteTest < ActiveSupport::TestCase class NewDomainForceDeleteTest < ActiveSupport::TestCase
setup do setup do
@domain = domains(:shop) @domain = domains(:shop)
Setting.redemption_grace_period = 45 Setting.redemption_grace_period = 30
end end
def test_schedules_force_delete_fast_track def test_schedules_force_delete_fast_track
@ -29,7 +29,6 @@ class NewDomainForceDeleteTest < ActiveSupport::TestCase
assert @domain.force_delete_scheduled? assert @domain.force_delete_scheduled?
assert_equal Date.parse('2010-09-19'), @domain.force_delete_date.to_date 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_equal Date.parse('2010-08-05'), @domain.force_delete_start.to_date
assert (@domain.statuses.include?(DomainStatus::CLIENT_HOLD))
end end
def test_schedules_force_delete_soft_less_than_year_ahead def test_schedules_force_delete_soft_less_than_year_ahead