From 85245035827a9ebdebd5d5616d1a1ca203a2aa2d Mon Sep 17 00:00:00 2001 From: olegphenomenon Date: Fri, 12 Nov 2021 14:40:25 +0200 Subject: [PATCH] added lift feature, fixed fd issues, changes mx to 2 --- app/models/concerns/email_verifable.rb | 5 ++-- app/models/validation_event.rb | 16 ++++++++--- lib/tasks/verify_email.rake | 7 ++++- test/tasks/emails/verify_email_task_test.rb | 30 +++++++++++++++++++++ 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/app/models/concerns/email_verifable.rb b/app/models/concerns/email_verifable.rb index 54a945ef8..1be0eea89 100644 --- a/app/models/concerns/email_verifable.rb +++ b/app/models/concerns/email_verifable.rb @@ -16,13 +16,14 @@ module EmailVerifable end def need_to_start_force_delete? + flag = false ValidationEvent::INVALID_EVENTS_COUNT_BY_LEVEL.each do |level, count| if validation_events.recent.count >= count && validate_email_data(level: level, count: count) - return true + flag = true end end - false + flag end def need_to_lift_force_delete? diff --git a/app/models/validation_event.rb b/app/models/validation_event.rb index 8e6a0a16d..3011a1c9e 100644 --- a/app/models/validation_event.rb +++ b/app/models/validation_event.rb @@ -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 = 45.minutes.freeze + VALIDATION_PERIOD = 30.minutes.freeze VALID_CHECK_LEVELS = %w[regex mx smtp].freeze VALID_EVENTS_COUNT_THRESHOLD = 5 @@ -26,7 +26,7 @@ class ValidationEvent < ApplicationRecord belongs_to :validation_eventable, polymorphic: true - scope :recent, -> { where('created_at > ?', Time.zone.now - VALIDATION_PERIOD) } + scope :recent, -> { where('created_at < ?', Time.zone.now - VALIDATION_PERIOD) } scope :successful, -> { where(success: true) } scope :failed, -> { where(success: false) } scope :regex, -> { where('event_data @> ?', { 'check_level': 'regex' }.to_json) } @@ -69,5 +69,15 @@ class ValidationEvent < ApplicationRecord Domains::ForceDeleteEmail::Base.run(email: email) end - def lift_force_delete; end + def lift_force_delete + domain_contacts = Contact.where(email: email).map(&:domain_contacts).flatten + registrant_ids = Registrant.where(email: email).pluck(:id) + + domains = domain_contacts.map(&:domain).flatten + + Domain.where(registrant_id: registrant_ids) + + domains.each do |domain| + Domains::ForceDeleteLift::Base.run(domain: domain) + end + end end diff --git a/lib/tasks/verify_email.rake b/lib/tasks/verify_email.rake index 62f80aabb..9810900d3 100644 --- a/lib/tasks/verify_email.rake +++ b/lib/tasks/verify_email.rake @@ -67,9 +67,14 @@ def failed_contacts failed_validations_ids = ValidationEvent.failed.pluck(:validation_eventable_id) contacts = Contact.where(id: failed_validations_ids) contacts.each do |contact| - failed_contacts << contact unless contact.validation_events.last.success + failed_contacts << contact unless contact.validation_events.order(created_at: :asc).last.success end + # failed_contacts.each do |f| + # p "+++++++++" + # p f + # p "+++++++++" + # end failed_contacts end diff --git a/test/tasks/emails/verify_email_task_test.rb b/test/tasks/emails/verify_email_task_test.rb index f16ce2871..20582d74f 100644 --- a/test/tasks/emails/verify_email_task_test.rb +++ b/test/tasks/emails/verify_email_task_test.rb @@ -120,6 +120,36 @@ class VerifyEmailTaskTest < ActiveJob::TestCase assert contact.domains.last.force_delete_scheduled? end + def test_change_failed_email_to_another_faield_email_shouldnt_to_remove_fd + assert_equal ValidationEvent.count, 0 + run_task + assert_equal Contact.count, 9 + assert_equal ValidationEvent.count, 8 # Contact has duplicate email and it is skip + + contact = contacts(:john) + v = ValidationEvent.find_by(validation_eventable_id: contact.id) + v.update!(success: false) + + 4.times do + contact.validation_events << v.dup + end + + run_task + assert_equal ValidationEvent.all.count, 13 + + assert contact.domains.last.force_delete_scheduled? + + contact.email = "another@inbox.txt" + contact.save + contact.reload + v = ValidationEvent.find_by(validation_eventable_id: contact.id) + v.update!(success: false) + + run_task + + assert contact.domains.last.force_delete_scheduled? + end + def test_tasks_verifies_emails capture_io { run_task }