internetee/registry

View on GitHub
app/jobs/verify_emails_job.rb

Summary

Maintainability
A
25 mins
Test Coverage
A
93%
class VerifyEmailsJob < ApplicationJob
  discard_on StandardError

  def perform(email:, check_level: 'mx')
    contact = Contact.find_by(email: email)

    return logger.info "Contact #{email} not found!" if contact.nil?

    return unless need_to_verify?(contact)

    validate_check_level(check_level)

    logger.info "Trying to verify contact email #{email} with check_level #{check_level}"
    contact.verify_email(check_level: check_level)
  rescue StandardError => e
    handle_error(e)
  end

  private

  def validate_check_level(check_level)
    return if valid_check_levels.include? check_level

    raise StandardError, "Check level #{check_level} is invalid"
  end

  def need_to_verify?(contact)
    return true if contact.validation_events.empty?

    last_validation = contact.validation_events.last
    expired_last_validation = last_validation.successful? && last_validation.created_at < validation_expiry_date
    failed_last_regex_validation = last_validation.failed? && last_validation.event_data['check_level'] == 'regex'

    return true if expired_last_validation

    !failed_last_regex_validation
  end

  def logger
    @logger ||= Rails.logger
  end

  def valid_check_levels
    ValidationEvent::VALID_CHECK_LEVELS
  end

  def validation_expiry_date
    Time.zone.now - ValidationEvent::VALIDATION_PERIOD
  end

  def handle_error(error)
    logger.error error.message
    raise error
  end
end