mirror of
https://github.com/internetee/registry.git
synced 2025-06-11 07:04:47 +02:00
87 lines
2.8 KiB
Ruby
87 lines
2.8 KiB
Ruby
module Domain::RegistryLockable
|
|
extend ActiveSupport::Concern
|
|
|
|
LOCK_STATUSES = if Feature.enable_lock_domain_with_new_statuses?
|
|
[DomainStatus::SERVER_OBJ_UPDATE_PROHIBITED,
|
|
DomainStatus::SERVER_DELETE_PROHIBITED,
|
|
DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze
|
|
else
|
|
[DomainStatus::SERVER_UPDATE_PROHIBITED,
|
|
DomainStatus::SERVER_DELETE_PROHIBITED,
|
|
DomainStatus::SERVER_TRANSFER_PROHIBITED].freeze
|
|
end
|
|
|
|
EXTENSIONS_STATUS = [DomainStatus::SERVER_EXTENSION_UPDATE_PROHIBITED].freeze
|
|
|
|
def apply_registry_lock(extensions_prohibited:)
|
|
return unless registry_lockable?
|
|
return if locked_by_registrant?
|
|
|
|
transaction do
|
|
apply_statuses_locked_statuses(extensions_prohibited: extensions_prohibited)
|
|
end
|
|
end
|
|
|
|
def apply_statuses_locked_statuses(extensions_prohibited:)
|
|
self.admin_store_statuses_history = self.statuses
|
|
self.statuses |= LOCK_STATUSES
|
|
self.statuses |= EXTENSIONS_STATUS if Feature.obj_and_extensions_statuses_enabled? && extensions_prohibited
|
|
self.locked_by_registrant_at = Time.zone.now
|
|
alert_registrar_lock_changes!(lock: true)
|
|
|
|
save!
|
|
end
|
|
|
|
def registry_lockable?
|
|
(statuses & [DomainStatus::PENDING_DELETE_CONFIRMATION,
|
|
DomainStatus::PENDING_CREATE, DomainStatus::PENDING_UPDATE,
|
|
DomainStatus::PENDING_DELETE, DomainStatus::PENDING_RENEW,
|
|
DomainStatus::PENDING_TRANSFER]).empty?
|
|
end
|
|
|
|
def locked_by_registrant?
|
|
return false unless locked_by_registrant_at
|
|
|
|
(statuses & LOCK_STATUSES).count == 3
|
|
end
|
|
|
|
def remove_registry_lock
|
|
return unless locked_by_registrant?
|
|
|
|
transaction do
|
|
remove_statuses_from_locked_domain
|
|
end
|
|
end
|
|
|
|
def restore_statuses_if_domain_had_fd
|
|
self.statuses = self.statuses | Domain::FORCE_DELETE_STATUSES
|
|
|
|
save!
|
|
end
|
|
|
|
def remove_statuses_from_locked_domain
|
|
fd_flag = force_delete_scheduled?
|
|
LOCK_STATUSES.each do |domain_status|
|
|
statuses.delete([domain_status])
|
|
end
|
|
|
|
self.force_delete_domain_statuses_history -= LOCK_STATUSES if force_delete_domain_statuses_history.present?
|
|
statuses.delete([EXTENSIONS_STATUS]) if statuses.include? EXTENSIONS_STATUS
|
|
self.locked_by_registrant_at = nil
|
|
self.statuses = admin_store_statuses_history || []
|
|
self.statuses = self.statuses | Domain::FORCE_DELETE_STATUSES if fd_flag
|
|
alert_registrar_lock_changes!(lock: false)
|
|
|
|
save!
|
|
end
|
|
|
|
def alert_registrar_lock_changes!(lock: true)
|
|
translation = lock ? 'locked' : 'unlocked'
|
|
registrar.notifications.create!(
|
|
text: I18n.t("notifications.texts.registrar_#{translation}",
|
|
domain_name: name),
|
|
attached_obj_id: name,
|
|
attached_obj_type: self.class.name
|
|
)
|
|
end
|
|
end
|