app/jobs/verify_emails_job.rb
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