Improve check force delete query

This commit is contained in:
Thiago Youssef 2022-05-10 14:35:12 +03:00
parent ee76deaf52
commit 27fbf224f9
2 changed files with 23 additions and 25 deletions

View file

@ -1,29 +1,8 @@
desc 'Check Force Delete'
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)
task check_force_delete: :environment do
batch = ActiveModel::Type::Boolean.new.cast(args[:batch])
batch_size = args[:batch_size].to_i
batches_delay = args[:batches_delay].to_i.minutes
validations = ValidationEvent.select(:validation_eventable_id).failed.where(validation_eventable_type: 'Contact').group(:validation_eventable_id)
invalid_contact_ids = (validations.mx.having("count(event_data ->> 'success') > 2") + validations.regex).pluck(:validation_eventable_id)
invalid_contacts = Contact.joins(:validation_events).select do |contact|
events = contact.validation_events
mx = events.mx.select(&:failed?).count >= ValidationEvent::MX_CHECK
regex = events.regex.select(&:failed?).present?
(contact.need_to_start_force_delete? || contact.need_to_lift_force_delete?) && (mx || regex)
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
CheckForceDeleteJob.perform_later(invalid_contact_ids)
end