internetee/registry

View on GitHub
app/interactions/actions/contact_create.rb

Summary

Maintainability
A
0 mins
Test Coverage
C
71%
module Actions
  class ContactCreate
    attr_reader :contact, :legal_document, :ident

    def initialize(contact, legal_document, ident)
      @contact = contact
      @legal_document = legal_document
      @ident = ident
    end

    def call
      maybe_remove_address
      maybe_attach_legal_doc
      validate_ident
      maybe_change_email
      commit
    end

    def maybe_change_email
      return if Rails.env.test?

      %i[regex mx].each do |m|
        result = Actions::SimpleMailValidator.run(email: contact.email, level: m)
        if result
          @contact.validate_email_by_regex_and_mx
          @contact.remove_force_delete_for_valid_contact

          next
        end

        err_text = "email '#{contact.email}' didn't pass validation"
        contact.add_epp_error('2005', nil, nil, "#{I18n.t(:parameter_value_syntax_error)} #{err_text}")
        @error = true
        return
      end

      true
    end

    def maybe_remove_address
      return if Contact.address_processing?

      contact.city = nil
      contact.zip = nil
      contact.street = nil
      contact.state = nil
      contact.country_code = nil
    end

    def validate_ident
      validate_ident_integrity
      validate_ident_birthday

      identifier = ::Contact::Ident.new(code: ident[:ident], type: ident[:ident_type],
                                        country_code: ident[:ident_country_code])

      identifier.validate
      contact.identifier = identifier
    end

    def validate_ident_integrity
      return if ident.blank?

      if ident[:ident_type].blank?
        contact.add_epp_error('2003', nil, 'ident_type',
                              I18n.t('errors.messages.required_ident_attribute_missing'))
        @error = true
      elsif !%w[priv org birthday].include?(ident[:ident_type])
        contact.add_epp_error('2003', nil, 'ident_type', 'Invalid ident type')
        @error = true
      end
    end

    def validate_ident_birthday
      return if ident.blank?
      return unless ident[:ident_type] != 'birthday' && ident[:ident_country_code].blank?

      contact.add_epp_error('2003', nil, 'ident_country_code',
                            I18n.t('errors.messages.required_ident_attribute_missing'))
      @error = true
    end

    def maybe_attach_legal_doc
      ::Actions::BaseAction.attach_legal_doc_to_new(contact, legal_document, domain: false)
    end

    def commit
      contact.id = nil # new record
      return false if @error

      contact.generate_code
      contact.email_history = contact.email
      contact.save
    end
  end
end