Add rake task optional args

This commit is contained in:
Thiago Youssef 2022-05-03 13:43:19 +03:00
parent be0ac715b1
commit b1afdbf50e
4 changed files with 39 additions and 18 deletions

View file

@ -1,22 +1,25 @@
class ValidationEventCheckForceDeleteJob < ApplicationJob class CheckForceDeleteJob < ApplicationJob
def perform(contact_id) def perform(contact_ids)
@contact = Contact.find(contact_id) contacts = Contact.find(contact_ids)
email = @contact.email
if @contact.need_to_start_force_delete? contacts.each do |contact|
Domains::ForceDeleteEmail::Base.run(email: email) email = contact.email
elsif @contact.need_to_lift_force_delete?
domain_list(email).each { |domain| refresh_status_notes(domain) } if contact.need_to_start_force_delete?
Domains::ForceDeleteEmail::Base.run(email: email)
elsif contact.need_to_lift_force_delete?
domain_list(email).each { |domain| refresh_status_notes(contact, domain) }
end
end end
end end
private private
def refresh_status_notes(domain) def refresh_status_notes(contact, domain)
force_delete_emails = domain.status_notes[DomainStatus::FORCE_DELETE] force_delete_emails = domain.status_notes[DomainStatus::FORCE_DELETE]
return unless force_delete_emails return unless force_delete_emails
force_delete_emails.slice!(@contact.email_history) force_delete_emails.slice!(contact.email_history)
force_delete_emails.lstrip! force_delete_emails.lstrip!
domain.save(validate: false) domain.save(validate: false)

View file

@ -1,11 +1,29 @@
desc 'Check Force Delete' desc 'Check Force Delete'
task check_force_delete: :environment do task :check_force_delete, %i[batch batch_size batches_delay] => :environment do |_t, args|
args.with_defaults(batch: false, batch_size: 1_000, batches_delay: 15)
batch = ActiveModel::Type::Boolean.new.cast(args[:batch])
batch_size = args[:batch_size].to_i
batches_delay = args[:batches_delay].to_i.minutes
invalid_contacts = Contact.joins(:validation_events).select do |contact| invalid_contacts = Contact.joins(:validation_events).select do |contact|
events = contact.validation_events events = contact.validation_events
events.mx.count >= 3 || events.regex.present? mx = events.mx.select(&:failed?).count >= ValidationEvent::MX_CHECK
end.uniq(&:id) regex = events.regex.select(&:failed?).present?
invalid_contacts.each do |contact| (contact.need_to_start_force_delete? || contact.need_to_lift_force_delete?) && (mx || regex)
ValidationEventCheckForceDeleteJob.perform_later(contact.id) end.uniq
if batch
waiting_minutes = 0.minutes
invalid_contacts.find_in_batches(batch_size: batch_size) do |contact_batches|
CheckForceDeleteJob.set(wait: waiting_minutes).perform_later(contact_batches)
waiting_minutes += batches_delay
end
else
invalid_contacts.each do |contact|
CheckForceDeleteJob.perform_later([contact.id])
end
end end
end end

View file

@ -540,7 +540,7 @@ class ForceDeleteTest < ActionMailer::TestCase
def perform_check_force_delete_job(contact_id) def perform_check_force_delete_job(contact_id)
perform_enqueued_jobs do perform_enqueued_jobs do
ValidationEventCheckForceDeleteJob.perform_now(contact_id) ValidationEventCheckForceDeleteJob.perform_now([contact_id])
end end
end end
end end

View file

@ -27,7 +27,7 @@ class CheckForceDeleteTaskTest < ActiveSupport::TestCase
run_task run_task
assert_enqueued_jobs 1 assert_enqueued_jobs 1
assert_enqueued_with(job: ValidationEventCheckForceDeleteJob, args: [@contact.id]) assert_enqueued_with(job: CheckForceDeleteJob, args: [@contact.id])
end end
def test_enque_force_delete_when_invalid_record_by_regex def test_enque_force_delete_when_invalid_record_by_regex
@ -35,7 +35,7 @@ class CheckForceDeleteTaskTest < ActiveSupport::TestCase
run_task run_task
assert_enqueued_jobs 1 assert_enqueued_jobs 1
assert_enqueued_with(job: ValidationEventCheckForceDeleteJob, args: [@invalid_contact.id]) assert_enqueued_with(job: CheckForceDeleteJob, args: [@invalid_contact.id])
end end
private private