diff --git a/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb b/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb
index 77c8eba5e..74460eb31 100644
--- a/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb
+++ b/app/interactions/domains/cancel_force_delete/remove_force_delete_statuses.rb
@@ -15,6 +15,10 @@ module Domains
rejected_statuses = domain.statuses.reject { |a| domain_statuses.include? a }
domain.statuses = rejected_statuses
domain.skip_whois_record_update = true
+ domain.lift_force_delete_domain_statuses_history_data = {
+ reason: domain.status_notes[DomainStatus::FORCE_DELETE],
+ date: Time.zone.now
+ }
domain.save(validate: false)
end
end
diff --git a/app/interactions/domains/force_delete/set_status.rb b/app/interactions/domains/force_delete/set_status.rb
index cedef18d5..76947dfa2 100644
--- a/app/interactions/domains/force_delete/set_status.rb
+++ b/app/interactions/domains/force_delete/set_status.rb
@@ -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
diff --git a/app/jobs/force_delete_daily_admin_notifier_job.rb b/app/jobs/force_delete_daily_admin_notifier_job.rb
index 88a59c606..0fd6ca898 100644
--- a/app/jobs/force_delete_daily_admin_notifier_job.rb
+++ b/app/jobs/force_delete_daily_admin_notifier_job.rb
@@ -1,23 +1,34 @@
class ForceDeleteDailyAdminNotifierJob < ApplicationJob
queue_as :default
- def perform
- domains = Domain.where("'#{DomainStatus::FORCE_DELETE}' = ANY (statuses)")
- .where("force_delete_start = ?", Time.zone.now)
-
- return if domains.empty?
-
- notify_admins(domains)
+ def perform()
+ notify_about_force_deleted_domains(force_deleted_domains, lifted_force_delete_domains)
end
private
- def notify_admins(domains)
- summary = generate_summary(domains)
- AdminMailer.force_delete_daily_summary(summary).deliver_now
+ def force_deleted_domains
+ 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
- def generate_summary(domains)
+ def lifted_force_delete_domains
+ Domain.where("json_statuses_history->>'lift_force_delete_domain_statuses_history_data' IS NOT NULL")
+ .where("(json_statuses_history->'lift_force_delete_domain_statuses_history_data'->>'date')::timestamp >= ? AND (json_statuses_history->'lift_force_delete_domain_statuses_history_data'->>'date')::timestamp <= ?",
+ Time.zone.yesterday.beginning_of_day,
+ Time.zone.yesterday.end_of_day)
+ end
+
+ def notify_about_force_deleted_domains(force_deleted_domains, lifted_force_delete_domains)
+ force_deleted_summary = generate_summary_for_force_deleted_domains(force_deleted_domains)
+ lifted_force_delete_summary = generate_summary_for_lifted_force_delete_domains(lifted_force_delete_domains)
+
+ AdminMailer.force_delete_daily_summary(force_deleted_summary, lifted_force_delete_summary).deliver_now
+ end
+
+ def generate_summary_for_force_deleted_domains(domains)
domains.map do |domain|
{
name: domain.name,
@@ -29,6 +40,16 @@ class ForceDeleteDailyAdminNotifierJob < ApplicationJob
end
end
+ def generate_summary_for_lifted_force_delete_domains(domains)
+ domains.map do |domain|
+ {
+ name: domain.name,
+ reason: domain.json_statuses_history.dig('lift_force_delete_domain_statuses_history_data', 'reason') || 'No reason provided',
+ date: domain.json_statuses_history.dig('lift_force_delete_domain_statuses_history_data', 'date')
+ }
+ end
+ end
+
def determine_reason(domain)
if domain.template_name.present?
domain.template_name
diff --git a/app/mailers/admin_mailer.rb b/app/mailers/admin_mailer.rb
index b76db8a67..c6ae3d89a 100644
--- a/app/mailers/admin_mailer.rb
+++ b/app/mailers/admin_mailer.rb
@@ -1,9 +1,10 @@
class AdminMailer < ApplicationMailer
- def force_delete_daily_summary(domains_summary)
- @domains = domains_summary
+ def force_delete_daily_summary(force_deleted_summary, lifted_force_delete_summary)
+ @force_deleted_domains = force_deleted_summary
+ @lifted_domains = lifted_force_delete_summary
mail(
to: ENV['admin_notification_email'] || 'admin@registry.test',
subject: "Force Delete Daily Summary - #{Date.current}"
)
end
-end
\ No newline at end of file
+end
diff --git a/app/models/domain.rb b/app/models/domain.rb
index d8c32790e..809d18615 100644
--- a/app/models/domain.rb
+++ b/app/models/domain.rb
@@ -48,7 +48,9 @@ class Domain < ApplicationRecord
store_accessor :json_statuses_history,
:force_delete_domain_statuses_history,
- :admin_store_statuses_history
+ :admin_store_statuses_history,
+ :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?
diff --git a/app/views/admin_mailer/force_delete_daily_summary.html.erb b/app/views/admin_mailer/force_delete_daily_summary.html.erb
index 33f2bdea5..4e9281ee6 100644
--- a/app/views/admin_mailer/force_delete_daily_summary.html.erb
+++ b/app/views/admin_mailer/force_delete_daily_summary.html.erb
@@ -1,5 +1,6 @@
Force Delete Daily Summary - <%= Date.current %>
+Force Deleted Domains
@@ -11,13 +12,43 @@
- <% @domains.each do |domain| %>
+ <% if @force_deleted_domains.present? %>
+ <% @force_deleted_domains.each do |domain| %>
+
+ <%= domain[:name] %> |
+ <%= domain[:reason] %> |
+ <%= domain[:force_delete_type] %> |
+ <%= domain[:force_delete_start]&.to_date %> |
+ <%= domain[:force_delete_date]&.to_date %> |
+
+ <% end %>
+ <% else %>
- <%= domain[:name] %> |
- <%= domain[:reason] %> |
- <%= domain[:force_delete_type] %> |
- <%= domain[:force_delete_start]&.to_date %> |
- <%= domain[:force_delete_date]&.to_date %> |
+ No force deleted domains found |
+
+ <% end %>
+
+
+
+Lifted Force Delete Domains
+
+
+
+ Domain |
+ Reason |
+
+
+
+ <% if @lifted_domains.present? %>
+ <% @lifted_domains.each do |domain| %>
+
+ <%= domain[:name] %> |
+ <%= domain[:reason] %> |
+
+ <% end %>
+ <% else %>
+
+ No lifted domains found |
<% end %>
diff --git a/test/jobs/force_delete_daily_admin_notifier_job_test.rb b/test/jobs/force_delete_daily_admin_notifier_job_test.rb
index ebfa3f5d8..dd3f99d38 100644
--- a/test/jobs/force_delete_daily_admin_notifier_job_test.rb
+++ b/test/jobs/force_delete_daily_admin_notifier_job_test.rb
@@ -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)
+ @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
@@ -23,24 +26,13 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
assert_includes email.body.to_s, @domain.force_delete_type
end
- def test_does_not_send_notification_when_no_force_delete_domains_today
- travel_to Time.zone.parse('2010-07-06')
- @domain.schedule_force_delete(type: :soft)
- @domain.reload
-
- assert_no_emails do
- ForceDeleteDailyAdminNotifierJob.perform_now
- end
- end
-
def test_includes_multiple_domains_in_notification
@domain.schedule_force_delete(type: :soft)
- @domain.update!(force_delete_start: Time.zone.now.to_date)
-
domain2 = domains(:airport)
domain2.schedule_force_delete(type: :fast_track)
- domain2.update!(force_delete_start: Time.zone.now.to_date)
+ travel_to Time.zone.now + 1.day
+
assert_emails 1 do
ForceDeleteDailyAdminNotifierJob.perform_now
end
@@ -53,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)
@domain.reload
+ travel_to Time.zone.now + 1.day
+
assert_emails 1 do
ForceDeleteDailyAdminNotifierJob.perform_now
end
@@ -65,17 +58,41 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
end
def test_includes_correct_reason_for_manual_force_delete
- manual_reason = "Manual deletion requested"
- @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)
+ @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.schedule_force_delete(type: :fast_track,
+ notify_by_email: true,
+ reason: reason)
+ @domain.reload
+
+ assert @domain.force_delete_scheduled?
+
+ @domain.cancel_force_delete
+ @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, @domain.name
+ assert_includes email.body.to_s, "Company no: #{@domain.registrant.ident}"
end
end
\ No newline at end of file