mirror of
https://github.com/internetee/registry.git
synced 2025-07-30 14:36:22 +02:00
Merge pull request #2774 from internetee/daily-force-delete-and-lift-email-subscribe
feat: Add lifted force delete domains to daily admin notification
This commit is contained in:
commit
1dc3396391
7 changed files with 122 additions and 42 deletions
|
@ -15,6 +15,10 @@ module Domains
|
||||||
rejected_statuses = domain.statuses.reject { |a| domain_statuses.include? a }
|
rejected_statuses = domain.statuses.reject { |a| domain_statuses.include? a }
|
||||||
domain.statuses = rejected_statuses
|
domain.statuses = rejected_statuses
|
||||||
domain.skip_whois_record_update = true
|
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)
|
domain.save(validate: false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,6 +6,10 @@ module Domains
|
||||||
type == :fast_track ? force_delete_fast_track : force_delete_soft
|
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.status_notes[DomainStatus::FORCE_DELETE] = "Company no: #{domain.registrant.ident}" if reason == 'invalid_company'
|
||||||
domain.skip_whois_record_update = true
|
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)
|
domain.save(validate: false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,34 @@
|
||||||
class ForceDeleteDailyAdminNotifierJob < ApplicationJob
|
class ForceDeleteDailyAdminNotifierJob < ApplicationJob
|
||||||
queue_as :default
|
queue_as :default
|
||||||
|
|
||||||
def perform
|
def perform()
|
||||||
domains = Domain.where("'#{DomainStatus::FORCE_DELETE}' = ANY (statuses)")
|
notify_about_force_deleted_domains(force_deleted_domains, lifted_force_delete_domains)
|
||||||
.where("force_delete_start = ?", Time.zone.now)
|
|
||||||
|
|
||||||
return if domains.empty?
|
|
||||||
|
|
||||||
notify_admins(domains)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def notify_admins(domains)
|
def force_deleted_domains
|
||||||
summary = generate_summary(domains)
|
Domain.where("json_statuses_history->>'force_delete_domain_statuses_history_data' IS NOT NULL").
|
||||||
AdminMailer.force_delete_daily_summary(summary).deliver_now
|
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
|
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|
|
domains.map do |domain|
|
||||||
{
|
{
|
||||||
name: domain.name,
|
name: domain.name,
|
||||||
|
@ -29,6 +40,16 @@ class ForceDeleteDailyAdminNotifierJob < ApplicationJob
|
||||||
end
|
end
|
||||||
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)
|
def determine_reason(domain)
|
||||||
if domain.template_name.present?
|
if domain.template_name.present?
|
||||||
domain.template_name
|
domain.template_name
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
class AdminMailer < ApplicationMailer
|
class AdminMailer < ApplicationMailer
|
||||||
def force_delete_daily_summary(domains_summary)
|
def force_delete_daily_summary(force_deleted_summary, lifted_force_delete_summary)
|
||||||
@domains = domains_summary
|
@force_deleted_domains = force_deleted_summary
|
||||||
|
@lifted_domains = lifted_force_delete_summary
|
||||||
mail(
|
mail(
|
||||||
to: ENV['admin_notification_email'] || 'admin@registry.test',
|
to: ENV['admin_notification_email'] || 'admin@registry.test',
|
||||||
subject: "Force Delete Daily Summary - #{Date.current}"
|
subject: "Force Delete Daily Summary - #{Date.current}"
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -48,7 +48,9 @@ class Domain < ApplicationRecord
|
||||||
|
|
||||||
store_accessor :json_statuses_history,
|
store_accessor :json_statuses_history,
|
||||||
:force_delete_domain_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: 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?
|
# TODO: most inputs should be trimmed before validation, probably some global logic?
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<h1>Force Delete Daily Summary - <%= Date.current %></h1>
|
<h1>Force Delete Daily Summary - <%= Date.current %></h1>
|
||||||
|
|
||||||
|
<h2>Force Deleted Domains</h2>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -11,13 +12,43 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<% @domains.each do |domain| %>
|
<% if @force_deleted_domains.present? %>
|
||||||
|
<% @force_deleted_domains.each do |domain| %>
|
||||||
|
<tr>
|
||||||
|
<td><%= domain[:name] %></td>
|
||||||
|
<td><%= domain[:reason] %></td>
|
||||||
|
<td><%= domain[:force_delete_type] %></td>
|
||||||
|
<td><%= domain[:force_delete_start]&.to_date %></td>
|
||||||
|
<td><%= domain[:force_delete_date]&.to_date %></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
<tr>
|
<tr>
|
||||||
<td><%= domain[:name] %></td>
|
<td colspan="5">No force deleted domains found</td>
|
||||||
<td><%= domain[:reason] %></td>
|
</tr>
|
||||||
<td><%= domain[:force_delete_type] %></td>
|
<% end %>
|
||||||
<td><%= domain[:force_delete_start]&.to_date %></td>
|
</tbody>
|
||||||
<td><%= domain[:force_delete_date]&.to_date %></td>
|
</table>
|
||||||
|
|
||||||
|
<h2>Lifted Force Delete Domains</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Domain</th>
|
||||||
|
<th>Reason</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% if @lifted_domains.present? %>
|
||||||
|
<% @lifted_domains.each do |domain| %>
|
||||||
|
<tr>
|
||||||
|
<td><%= domain[:name] %></td>
|
||||||
|
<td><%= domain[:reason] %></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
<tr>
|
||||||
|
<td colspan="1">No lifted domains found</td>
|
||||||
</tr>
|
</tr>
|
||||||
<% end %>
|
<% end %>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|
|
@ -10,10 +10,13 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_sends_notification_for_domains_with_force_delete_today
|
def test_sends_notification_for_domains_with_force_delete_today
|
||||||
@domain.schedule_force_delete(type: :soft)
|
@domain.schedule_force_delete(type: :soft,
|
||||||
@domain.update!(force_delete_start: Time.zone.now.to_date)
|
notify_by_email: true,
|
||||||
|
reason: 'invalid_email')
|
||||||
@domain.reload
|
@domain.reload
|
||||||
|
|
||||||
|
travel_to Time.zone.now + 1.day
|
||||||
|
|
||||||
assert_emails 1 do
|
assert_emails 1 do
|
||||||
ForceDeleteDailyAdminNotifierJob.perform_now
|
ForceDeleteDailyAdminNotifierJob.perform_now
|
||||||
end
|
end
|
||||||
|
@ -23,24 +26,13 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
|
||||||
assert_includes email.body.to_s, @domain.force_delete_type
|
assert_includes email.body.to_s, @domain.force_delete_type
|
||||||
end
|
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
|
def test_includes_multiple_domains_in_notification
|
||||||
@domain.schedule_force_delete(type: :soft)
|
@domain.schedule_force_delete(type: :soft)
|
||||||
@domain.update!(force_delete_start: Time.zone.now.to_date)
|
|
||||||
|
|
||||||
domain2 = domains(:airport)
|
domain2 = domains(:airport)
|
||||||
domain2.schedule_force_delete(type: :fast_track)
|
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
|
assert_emails 1 do
|
||||||
ForceDeleteDailyAdminNotifierJob.perform_now
|
ForceDeleteDailyAdminNotifierJob.perform_now
|
||||||
end
|
end
|
||||||
|
@ -53,9 +45,10 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
|
||||||
def test_includes_correct_reason_for_invalid_email_template
|
def test_includes_correct_reason_for_invalid_email_template
|
||||||
@domain.update!(template_name: 'invalid_email')
|
@domain.update!(template_name: 'invalid_email')
|
||||||
@domain.schedule_force_delete(type: :soft)
|
@domain.schedule_force_delete(type: :soft)
|
||||||
@domain.update!(force_delete_start: Time.zone.now.to_date)
|
|
||||||
@domain.reload
|
@domain.reload
|
||||||
|
|
||||||
|
travel_to Time.zone.now + 1.day
|
||||||
|
|
||||||
assert_emails 1 do
|
assert_emails 1 do
|
||||||
ForceDeleteDailyAdminNotifierJob.perform_now
|
ForceDeleteDailyAdminNotifierJob.perform_now
|
||||||
end
|
end
|
||||||
|
@ -65,17 +58,41 @@ class ForceDeleteDailyAdminNotifierJobTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_includes_correct_reason_for_manual_force_delete
|
def test_includes_correct_reason_for_manual_force_delete
|
||||||
manual_reason = "Manual deletion requested"
|
@domain.schedule_force_delete(type: :fast_track,
|
||||||
@domain.status_notes = { DomainStatus::FORCE_DELETE => manual_reason }
|
notify_by_email: true,
|
||||||
@domain.schedule_force_delete(type: :fast_track)
|
reason: 'invalid_company')
|
||||||
@domain.update!(force_delete_start: Time.zone.now.to_date)
|
|
||||||
@domain.reload
|
@domain.reload
|
||||||
|
|
||||||
|
travel_to Time.zone.now + 1.day
|
||||||
|
|
||||||
assert_emails 1 do
|
assert_emails 1 do
|
||||||
ForceDeleteDailyAdminNotifierJob.perform_now
|
ForceDeleteDailyAdminNotifierJob.perform_now
|
||||||
end
|
end
|
||||||
|
|
||||||
email = ActionMailer::Base.deliveries.last
|
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
|
||||||
end
|
end
|
Loading…
Add table
Add a link
Reference in a new issue