demarches-normaliennes/lib/tasks/deployment/20221222173733_backfill_virus_scan_blobs.rake
2024-08-22 09:26:48 +02:00

34 lines
1.9 KiB
Ruby

# frozen_string_literal: true
namespace :after_party do
desc 'Deployment task: backfill_virus_scan_blobs'
task backfill_virus_scan_blobs: :environment do
puts "Running deploy task 'backfill_virus_scan_blobs'"
pending_blobs = ActiveStorage::Blob.where("metadata like '%\"virus_scan_result\":\"#{ActiveStorage::VirusScanner::PENDING}%'").where(virus_scan_result: nil)
infected_blobs = ActiveStorage::Blob.where("metadata like '%\"virus_scan_result\":\"#{ActiveStorage::VirusScanner::INFECTED}%'").where(virus_scan_result: nil)
integrity_error_blobs = ActiveStorage::Blob.where("metadata like '%\"virus_scan_result\":\"#{ActiveStorage::VirusScanner::INTEGRITY_ERROR}%'").where(virus_scan_result: nil)
safe_blobs = ActiveStorage::Blob.where("metadata like '%\"virus_scan_result\":\"#{ActiveStorage::VirusScanner::SAFE}%'").where(virus_scan_result: nil)
pp "pending blobs: #{pending_blobs.count}"
pp "infected blobs: #{infected_blobs.count}"
pp "with integrity error blobs: #{integrity_error_blobs.count}"
pending_blobs.in_batches.update_all(virus_scan_result: ActiveStorage::VirusScanner::PENDING)
infected_blobs.in_batches.update_all(virus_scan_result: ActiveStorage::VirusScanner::INFECTED)
integrity_error_blobs.in_batches.update_all(virus_scan_result: ActiveStorage::VirusScanner::INTEGRITY_ERROR)
safe_blobs_ids = safe_blobs.pluck(:id)
progress = ProgressReport.new(safe_blobs_ids.size)
safe_blobs_ids.in_groups_of(10_000) do |batch|
Migrations::BackfillVirusScanBlobsJob.perform_later(batch.compact)
progress.inc(batch.compact.size)
end
progress.finish
# Update task as completed. If you remove the line below, the task will
# run with every deploy (or every time you call after_party:run).
AfterParty::TaskRecord
.create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
end
end