internetee/registry

View on GitHub
app/models/domain_transfer.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
95%
class DomainTransfer < ApplicationRecord
  belongs_to :domain

  belongs_to :old_registrar, class_name: 'Registrar'
  belongs_to :new_registrar, class_name: 'Registrar'

  PENDING = 'pending'.freeze
  CLIENT_APPROVED = 'clientApproved'.freeze
  CLIENT_REJECTED = 'clientRejected'.freeze
  SERVER_APPROVED = 'serverApproved'.freeze

  before_create :set_wait_until

  class << self
    def request(domain, new_registrar)
      domain_transfer = create!(
        transfer_requested_at: Time.zone.now,
        domain: domain,
        old_registrar: domain.registrar,
        new_registrar: new_registrar
      )

      domain_transfer.approve if approve_automatically?
    end

    private

    def approve_automatically?
      Setting.transfer_wait_time.zero?
    end
  end

  def set_wait_until
    wait_time = Setting.transfer_wait_time
    return if wait_time == 0
    self.wait_until = transfer_requested_at + wait_time.hours
  end

  before_create :set_status

  def set_status
    if Setting.transfer_wait_time > 0
      self.status = PENDING unless status
    else
      self.status = SERVER_APPROVED unless status
      self.transferred_at = Time.zone.now unless transferred_at
    end
  end

  delegate :name, :valid_to, to: :domain, prefix: true

  def approved?
    status == CLIENT_APPROVED || status == SERVER_APPROVED
  end

  def pending?
    status == PENDING
  end

  def approve
    transaction do
      self.status = SERVER_APPROVED
      save!

      notify_old_registrar
      domain.transfer(new_registrar)
    end
  end

  private

  def notify_old_registrar
    old_contacts_codes = domain.contacts.pluck(:code).sort.uniq.join(', ')
    old_registrant_code = domain.registrant.code

    old_registrar.notifications.create!(
      text: I18n.t('notifications.texts.domain_transfer',
                   domain_name: domain.name,
                   old_contacts_codes: old_contacts_codes,
                   old_registrant_code: old_registrant_code),
      attached_obj_id: id,
      attached_obj_type: self.class.name
    )
  end
end