Sha256: faaf96cf7915680e4ff18fe6de3d6e52cd76115b1e74c5153622217f5de17169

Contents?: true

Size: 1.87 KB

Versions: 7

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true
require "email_assessor/address"
require "active_model"
require "active_model/validations"

class EmailValidator < ActiveModel::EachValidator
  def default_options
    { regex: true, disposable: false, mx: false, fastpass: true }
  end

  def validate_each(record, attribute, value)
    return unless value.present?

    options = default_options.merge!(self.options)

    address = EmailAssessor::Address.new(value)

    error(record, attribute) && return unless address.valid?

    # Skip all domain blocklist checks for fastpass domains.
    # The goal is to skip needless validation for common "good" domains such as Gmail, Yahoo, and Outlook.
    # The fastpass domain list is configurable via vendor/fastpass_domains.txt
    validate_domain(record, attribute, address, options) unless options[:fastpass] && address.fastpass?

    # Exit early if validate_domain found a validation error
    return if record.errors.key?(attribute)

    if options[:mx]
      error(record, attribute, error_type(:mx, options)) && return unless address.valid_mx?
    end
  end

  private

  def error(record, attribute, type = options[:message] || :invalid)
    record.errors.add(attribute, type)
  end

  def error_type(validator, options)
    option_value = options[validator]

    if option_value.is_a?(String) || option_value.is_a?(Symbol)
      return option_value
    end

    options[:message] || :invalid
  end

  def validate_domain(record, attribute, address, options)
    if options[:disposable]
      error(record, attribute, error_type(:disposable, options)) && return if address.disposable?
    end

    if options[:blacklist]
      error(record, attribute, error_type(:blacklist, options)) && return if address.blacklisted?
    end

    if options[:educational]
      error(record, attribute, error_type(:educational, options)) && return if address.educational?
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
email_assessor-1.0.6 lib/email_assessor/email_validator.rb
email_assessor-1.0.5 lib/email_assessor/email_validator.rb
email_assessor-1.0.4 lib/email_assessor/email_validator.rb
email_assessor-1.0.3 lib/email_assessor/email_validator.rb
email_assessor-1.0.2 lib/email_assessor/email_validator.rb
email_assessor-1.0.1 lib/email_assessor/email_validator.rb
email_assessor-1.0.0 lib/email_assessor/email_validator.rb