refactor: improve force delete domain status tracking

- Add force_delete_domain_statuses_history_data to store force delete metadata
- Update force delete queries to use new JSON status history
- Refactor force delete tests to use travel_to helper
- Remove direct force_delete_start field usage
- Update status notes to include company identification number
This commit is contained in:
oleghasjanov 2025-04-01 13:52:43 +03:00
parent 917e426d91
commit bfecc3c40e
4 changed files with 29 additions and 20 deletions

View file

@ -6,6 +6,10 @@ module Domains
type == :fast_track ? force_delete_fast_track : force_delete_soft
domain.status_notes[DomainStatus::FORCE_DELETE] = "Company no: #{domain.registrant.ident}" if reason == 'invalid_company'
domain.skip_whois_record_update = true
domain.force_delete_domain_statuses_history_data = {
reason: domain.status_notes[DomainStatus::FORCE_DELETE],
date: Time.zone.now
}
domain.save(validate: false)
end

View file

@ -8,7 +8,8 @@ class ForceDeleteDailyAdminNotifierJob < ApplicationJob
private
def force_deleted_domains
Domain.where("force_delete_start >= ? AND force_delete_start <= ?",
Domain.where("json_statuses_history->>'force_delete_domain_statuses_history_data' IS NOT NULL").
where("(json_statuses_history->'force_delete_domain_statuses_history_data'->>'date')::timestamp >= ? AND (json_statuses_history->'force_delete_domain_statuses_history_data'->>'date')::timestamp <= ?",
Time.zone.yesterday.beginning_of_day,
Time.zone.yesterday.end_of_day)
end

View file

@ -49,7 +49,8 @@ class Domain < ApplicationRecord
store_accessor :json_statuses_history,
:force_delete_domain_statuses_history,
:admin_store_statuses_history,
:lift_force_delete_domain_statuses_history_data
:lift_force_delete_domain_statuses_history_data,
:force_delete_domain_statuses_history_data
# TODO: whois requests ip whitelist for full info for own domains and partial info for other domains
# TODO: most inputs should be trimmed before validation, probably some global logic?

View file

@ -10,10 +10,13 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
end
def test_sends_notification_for_domains_with_force_delete_today
@domain.schedule_force_delete(type: :soft)
@domain.update!(force_delete_start: Time.zone.now.to_date - 1.day)
@domain.schedule_force_delete(type: :soft,
notify_by_email: true,
reason: 'invalid_email')
@domain.reload
travel_to Time.zone.now + 1.day
assert_emails 1 do
ForceDeleteDailyAdminNotifierJob.perform_now
end
@ -25,11 +28,10 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
def test_includes_multiple_domains_in_notification
@domain.schedule_force_delete(type: :soft)
@domain.update!(force_delete_start: Time.zone.now.to_date - 1.day)
domain2 = domains(:airport)
domain2.schedule_force_delete(type: :fast_track)
domain2.update!(force_delete_start: Time.zone.now.to_date - 1.day)
travel_to Time.zone.now + 1.day
assert_emails 1 do
ForceDeleteDailyAdminNotifierJob.perform_now
@ -43,9 +45,10 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
def test_includes_correct_reason_for_invalid_email_template
@domain.update!(template_name: 'invalid_email')
@domain.schedule_force_delete(type: :soft)
@domain.update!(force_delete_start: Time.zone.now.to_date - 1.day)
@domain.reload
travel_to Time.zone.now + 1.day
assert_emails 1 do
ForceDeleteDailyAdminNotifierJob.perform_now
end
@ -55,29 +58,29 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
end
def test_includes_correct_reason_for_manual_force_delete
manual_reason = "invalid_company"
@domain.status_notes = { DomainStatus::FORCE_DELETE => manual_reason }
@domain.schedule_force_delete(type: :fast_track)
@domain.update!(force_delete_start: Time.zone.now.to_date - 1.day)
@domain.schedule_force_delete(type: :fast_track,
notify_by_email: true,
reason: 'invalid_company')
@domain.reload
travel_to Time.zone.now + 1.day
assert_emails 1 do
ForceDeleteDailyAdminNotifierJob.perform_now
end
email = ActionMailer::Base.deliveries.last
assert_includes email.body.to_s, "Manual force delete: #{manual_reason}"
assert_includes email.body.to_s, "Company no: #{@domain.registrant.ident}"
end
def test_includes_lifted_force_delete_domains_in_notification
reason = "invalid_company"
@domain.status_notes = { DomainStatus::FORCE_DELETE => reason }
@domain.schedule_force_delete(type: :fast_track)
@domain.update!(force_delete_start: Time.zone.now.to_date - 1.day)
@domain.schedule_force_delete(type: :fast_track,
notify_by_email: true,
reason: reason)
@domain.reload
assert @domain.force_delete_scheduled?
assert_equal @domain.status_notes[DomainStatus::FORCE_DELETE], reason
@domain.cancel_force_delete
@domain.reload
@ -90,6 +93,6 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
email = ActionMailer::Base.deliveries.last
assert_includes email.body.to_s, @domain.name
assert_includes email.body.to_s, reason
assert_includes email.body.to_s, "Company no: #{@domain.registrant.ident}"
end
end