diff --git a/app/models/domain.rb b/app/models/domain.rb index 479a3d453..ffe1d94c7 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -11,6 +11,9 @@ class Domain < ActiveRecord::Base attr_accessor :legal_document_id + alias_attribute :outzone_time, :outzone_at + alias_attribute :delete_time, :delete_at + # TODO: whois requests ip whitelist for full info for own domains and partial info for other domains # TODO: most inputs should be trimmed before validatation, probably some global logic? @@ -739,5 +742,13 @@ class Domain < ActiveRecord::Base def self.redemption_grace_period Setting.redemption_grace_period.days end + + def self.outzone_candidates + where("#{attribute_alias(:outzone_time)} < ?", Time.zone.now) + end + + def self.delete_candidates + where("#{attribute_alias(:delete_time)} < ?", Time.zone.now) + end end # rubocop: enable Metrics/ClassLength diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index dd1faa10e..4f60407cd 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -53,10 +53,12 @@ class DomainCron STDOUT << "#{Time.zone.now.utc} - Setting server_hold to domains\n" unless Rails.env.test? ::PaperTrail.whodunnit = "cron - #{__method__}" - d = Domain.where('outzone_at <= ?', Time.zone.now) + + domains = Domain.outzone_candidates marked = 0 real = 0 - d.each do |domain| + + domains.each do |domain| next unless domain.server_holdable? real += 1 domain.statuses << DomainStatus::SERVER_HOLD @@ -96,16 +98,18 @@ class DomainCron c = 0 - Domain.where('delete_at <= ?', Time.zone.now.end_of_day.utc).each do |x| - next unless x.delete_candidateable? + domains = Domain.delete_candidates - x.statuses << DomainStatus::DELETE_CANDIDATE + domains.each do |domain| + next unless domain.delete_candidateable? + + domain.statuses << DomainStatus::DELETE_CANDIDATE # If domain successfully saved, add it to delete schedule - if x.save(validate: false) + if domain.save(validate: false) ::PaperTrail.whodunnit = "cron - #{__method__}" - DomainDeleteJob.enqueue(x.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now) - STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: job added by deleteCandidate status ##{x.id} (#{x.name})\n" unless Rails.env.test? + DomainDeleteJob.enqueue(domain.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now) + STDOUT << "#{Time.zone.now.utc} Domain.destroy_delete_candidates: job added by deleteCandidate status ##{domain.id} (#{domain.name})\n" unless Rails.env.test? c += 1 end end diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 9560f7505..521983e1d 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -826,6 +826,9 @@ RSpec.describe Domain do end RSpec.describe Domain, db: false do + it { is_expected.to alias_attribute(:outzone_time, :outzone_at) } + it { is_expected.to alias_attribute(:delete_time, :delete_at) } + describe '::expire_warning_period', db: true do before :example do Setting.expire_warning_period = 1 @@ -882,4 +885,36 @@ RSpec.describe Domain, db: false do expect(domain.delete_at).to eq(Time.zone.parse('08.07.2010 10:30')) end end + + describe '::outzone_candidates', db: true do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + + Fabricate(:zonefile_setting, origin: 'ee') + + Fabricate.create(:domain, id: 1, outzone_time: Time.zone.parse('04.07.2010 23:59')) + Fabricate.create(:domain, id: 2, outzone_time: Time.zone.parse('05.07.2010 00:00')) + Fabricate.create(:domain, id: 3, outzone_time: Time.zone.parse('05.07.2010 00:01')) + end + + it 'returns domains with outzone time in the past' do + expect(described_class.outzone_candidates.ids).to eq([1]) + end + end + + describe '::delete_candidates', db: true do + before :example do + travel_to Time.zone.parse('05.07.2010 00:00') + + Fabricate(:zonefile_setting, origin: 'ee') + + Fabricate.create(:domain, id: 1, delete_time: Time.zone.parse('04.07.2010 23:59')) + Fabricate.create(:domain, id: 2, delete_time: Time.zone.parse('05.07.2010 00:00')) + Fabricate.create(:domain, id: 3, delete_time: Time.zone.parse('05.07.2010 00:01')) + end + + it 'returns domains with delete time in the past' do + expect(described_class.delete_candidates.ids).to eq([1]) + end + end end