diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index 96f1a94b3..9f69316d7 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -1,30 +1,50 @@ module Concerns::Domain::ForceDelete extend ActiveSupport::Concern - included do - alias_attribute :force_delete_time, :force_delete_at - end - def force_delete_scheduled? statuses.include?(DomainStatus::FORCE_DELETE) end def schedule_force_delete - self.statuses_backup = statuses - statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) - statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) + if discarded? + raise StandardError, 'Force delete procedure cannot be scheduled while a domain is discarded' + end + + preserve_current_statuses_for_force_delete + add_force_delete_statuses + self.force_delete_at = (Time.zone.now + (Setting.redemption_grace_period.days + 1.day)).utc + .beginning_of_day + stop_all_pending_actions + allow_deletion + save(validate: false) + end + + def cancel_force_delete + restore_statuses_before_force_delete + remove_force_delete_statuses + self.force_delete_at = nil + save(validate: false) + end + + private + + def stop_all_pending_actions statuses.delete(DomainStatus::PENDING_UPDATE) statuses.delete(DomainStatus::PENDING_TRANSFER) statuses.delete(DomainStatus::PENDING_RENEW) statuses.delete(DomainStatus::PENDING_CREATE) + end - statuses.delete(DomainStatus::FORCE_DELETE) - statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) - statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) - statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED) - statuses.delete(DomainStatus::SERVER_MANUAL_INZONE) - statuses.delete(DomainStatus::PENDING_DELETE) + def preserve_current_statuses_for_force_delete + self.statuses_before_force_delete = statuses + end + def restore_statuses_before_force_delete + self.statuses = statuses_before_force_delete + self.statuses_before_force_delete = nil + end + + def add_force_delete_statuses statuses << DomainStatus::FORCE_DELETE statuses << DomainStatus::SERVER_RENEW_PROHIBITED statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED @@ -34,21 +54,19 @@ module Concerns::Domain::ForceDelete if (statuses & [DomainStatus::SERVER_HOLD, DomainStatus::CLIENT_HOLD]).empty? statuses << DomainStatus::SERVER_MANUAL_INZONE end - - self.force_delete_at = (Time.zone.now + (Setting.redemption_grace_period.days + 1.day)).utc.beginning_of_day unless force_delete_at - save!(validate: false) end - def cancel_force_delete - s = [] - s << DomainStatus::EXPIRED if statuses.include?(DomainStatus::EXPIRED) - s << DomainStatus::SERVER_HOLD if statuses.include?(DomainStatus::SERVER_HOLD) - s << DomainStatus::DELETE_CANDIDATE if statuses.include?(DomainStatus::DELETE_CANDIDATE) + def remove_force_delete_statuses + statuses.delete(DomainStatus::FORCE_DELETE) + statuses.delete(DomainStatus::SERVER_RENEW_PROHIBITED) + statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) + statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED) + statuses.delete(DomainStatus::PENDING_DELETE) + statuses.delete(DomainStatus::SERVER_MANUAL_INZONE) + end - self.statuses = (statuses_backup + s).uniq - - self.force_delete_at = nil - self.statuses_backup = [] - save(validate: false) + def allow_deletion + statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) + statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) end end diff --git a/app/models/domain.rb b/app/models/domain.rb index c9023a29c..cf1a21d11 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -584,6 +584,7 @@ class Domain < ActiveRecord::Base hash = super hash['auth_info'] = hash.delete('transfer_code') # API v1 requirement hash['valid_from'] = hash['registered_at'] # API v1 requirement + hash.delete('statuses_before_force_delete') hash end diff --git a/app/presenters/domain_presenter.rb b/app/presenters/domain_presenter.rb index 824b7fc9c..917cd21a4 100644 --- a/app/presenters/domain_presenter.rb +++ b/app/presenters/domain_presenter.rb @@ -39,7 +39,7 @@ class DomainPresenter end def force_delete_date - view.l(domain.force_delete_time, format: :date) if domain.force_delete_time + view.l(domain.force_delete_at, format: :date) if domain.force_delete_at end def admin_contact_names @@ -55,20 +55,12 @@ class DomainPresenter end def force_delete_toggle_btn - if !domain.force_delete_scheduled? - view.content_tag(:a, view.t('admin.domains.force_delete_toggle_btn.schedule'), - data: { - toggle: 'modal', - target: '.domain-edit-force-delete-dialog', - }, - class: 'dropdown-item' - ) + return inactive_schedule_force_delete_btn if domain.discarded? + + if domain.force_delete_scheduled? + cancel_force_delete_btn else - view.link_to(view.t('admin.domains.force_delete_toggle_btn.cancel'), - view.admin_domain_force_delete_path(domain), - method: :delete, - data: { confirm: view.t('admin.domains.force_delete_toggle_btn.cancel_confirm') }, - class: 'dropdown-item') + schedule_force_delete_btn end end @@ -83,6 +75,32 @@ class DomainPresenter private + def schedule_force_delete_btn + view.content_tag(:a, view.t('admin.domains.force_delete_toggle_btn.schedule'), + class: 'btn btn-default', + data: { + toggle: 'modal', + target: '.domain-edit-force-delete-dialog', + }) + end + + def cancel_force_delete_btn + view.link_to view.t('admin.domains.force_delete_toggle_btn.cancel'), + view.admin_domain_force_delete_path(domain), + method: :delete, + data: { + confirm: view.t('admin.domains.force_delete_toggle_btn.cancel_confirm'), + }, + class: 'btn btn-primary' + end + + def inactive_schedule_force_delete_btn + view.content_tag :button, view.t('admin.domains.force_delete_toggle_btn.schedule'), + title: view.t('admin.domains.force_delete_toggle_btn.unable_to_schedule'), + disabled: true, + class: 'btn btn-default' + end + attr_reader :domain attr_reader :view end diff --git a/app/views/admin/domains/edit.html.erb b/app/views/admin/domains/edit.html.erb index 19c093f78..5d8f19349 100644 --- a/app/views/admin/domains/edit.html.erb +++ b/app/views/admin/domains/edit.html.erb @@ -1,30 +1,22 @@ <% domain = DomainPresenter.new(domain: @domain, view: self) %> -
-
-

- Edit: <%= domain.name_with_status %> -

-
-
-
- <%= link_to t('.back_btn'), [:admin, @domain], class: 'btn btn-default' %> + + +