optimize level check

This commit is contained in:
olegphenomenon 2021-11-23 16:06:28 +02:00
parent 0514b977be
commit 44614be547
2 changed files with 33 additions and 14 deletions

View file

@ -6,7 +6,7 @@
# For email_validation event kind also check_level (regex/mx/smtp) is stored in the event_data
class ValidationEvent < ApplicationRecord
enum event_type: ValidationEvent::EventType::TYPES, _suffix: true
VALIDATION_PERIOD = 2.years.freeze
VALIDATION_PERIOD = 1.year.freeze
VALID_CHECK_LEVELS = %w[regex mx smtp].freeze
VALID_EVENTS_COUNT_THRESHOLD = 5

View file

@ -61,32 +61,51 @@ def prepare_contacts(options)
validation_events_ids = ValidationEvent.where('created_at > ?', time).distinct.pluck(:validation_eventable_id)
contacts_ids = Contact.where.not(id: validation_events_ids).pluck(:id)
Contact.where(id: contacts_ids + failed_contacts)
Contact.where(id: contacts_ids + failed_contacts(options))
end
end
def failed_contacts
def failed_contacts(options)
failed_contacts = []
failed_validations_ids = ValidationEvent.failed.pluck(:validation_eventable_id)
contacts = Contact.where(id: failed_validations_ids).includes(:validation_events)
contacts.find_each(batch_size: 1000) do |contact|
contacts.find_each(batch_size: 10000) do |contact|
if contact.validation_events.mx.order(created_at: :asc).present?
failed_contacts << contact.id unless contact.validation_events.mx.order(created_at: :asc).last.success
end
if contact.validation_events.regex.order(created_at: :asc).present?
failed_contacts << contact.id unless contact.validation_events.regex.order(created_at: :asc).last.success
end
if contact.validation_events.smtp.order(created_at: :asc).present?
failed_contacts << contact.id unless contact.validation_events.mx.order(created_at: :asc).last.success
case options[:check_level]
when 'mx'
failed_contacts << unsuccess_mx(contact)
when 'regex'
failed_contacts << unsuccess_regex(contact)
when 'smtp'
failed_contacts << unsuccess_smtp(contact)
else
failed_contacts << unsuccess_mx(contact)
failed_contacts << unsuccess_regex(contact)
failed_contacts << unsuccess_smtp(contact)
end
end
failed_contacts.uniq
end
def unsuccess_mx(contact)
if contact.validation_events.mx.order(created_at: :asc).present?
contact.id unless contact.validation_events.mx.order(created_at: :asc).last.success
end
end
def unsuccess_regex(contact)
if contact.validation_events.regex.order(created_at: :asc).present?
contact.id unless contact.validation_events.regex.order(created_at: :asc).last.success
end
end
def unsuccess_smtp(contact)
if contact.validation_events.smtp.order(created_at: :asc).present?
contact.id unless contact.validation_events.smtp.order(created_at: :asc).last.success
end
end
def contacts_by_domain(domain_name)
domain = ::Domain.find_by(name: domain_name)
return unless domain