class MassEncryption::Encryptor
Constants
- DEFAULT_BATCH_SIZE
Attributes
batch_size[R]
encryptable_classes[R]
from_id[R]
silent[R]
tracks_count[R]
Public Class Methods
new(from_id: nil, only: nil, except: nil, batch_size: DEFAULT_BATCH_SIZE, tracks_count: nil, silent: true)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 6 def initialize(from_id: nil, only: nil, except: nil, batch_size: DEFAULT_BATCH_SIZE, tracks_count: nil, silent: true) only = Array(only || all_encryptable_classes) except = Array(except) @from_id = from_id @encryptable_classes = only - except @batch_size = batch_size @silent = silent @tracks_count = tracks_count logger.info info_message unless silent end
Public Instance Methods
encrypt_all_later()
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 19 def encrypt_all_later encryptable_classes.each { |klass| enqueue_encryption_jobs_for(klass) } end
Private Instance Methods
all_encryptable_classes()
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 71 def all_encryptable_classes @all_encryptable_classes ||= begin Rails.application.eager_load! unless Rails.application.config.eager_load ActiveRecord::Base.descendants.find_all { |klass| encryptable_class?(klass) } end end
all_records_for(klass)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 57 def all_records_for(klass) base = klass base = base.where("id >= ?", from_id) if from_id.present? base end
encryptable_class?(klass)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 78 def encryptable_class?(klass) has_encrypted_attributes?(klass) || has_encrypted_rich_text_attribute?(klass) end
enqueue_all_encryption_jobs_for(klass)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 51 def enqueue_all_encryption_jobs_for(klass) all_records_for(klass).select(:id).in_batches(of: batch_size, load: true) do |records| MassEncryption::Batch.new(klass: klass, from_id: records.first.id, size: batch_size).encrypt_later(auto_enqueue_next: false) end end
enqueue_encryption_jobs_for(klass)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 39 def enqueue_encryption_jobs_for(klass) if execute_in_sequential_tracks? enqueue_track_encryption_jobs_for(klass) else enqueue_all_encryption_jobs_for(klass) end end
enqueue_track_encryption_jobs_for(klass)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 63 def enqueue_track_encryption_jobs_for(klass) tracks_count.times.each do |track| if first_record = all_records_for(klass).first MassEncryption::Batch.new(klass: klass, from_id: first_record.id, size: batch_size, track: track, tracks_count: tracks_count)&.encrypt_later(auto_enqueue_next: true) end end end
execute_in_sequential_tracks?()
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 47 def execute_in_sequential_tracks? tracks_count.present? end
has_encrypted_attributes?(klass)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 82 def has_encrypted_attributes?(klass) klass.encrypted_attributes.present? end
has_encrypted_rich_text_attribute?(klass)
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 86 def has_encrypted_rich_text_attribute?(klass) klass.reflect_on_all_associations(:has_one).find { |relation| relation.klass == ActionText::EncryptedRichText } end
info_message()
click to toggle source
# File lib/mass_encryption/encryptor.rb, line 26 def info_message message = "Encrypting #{encryptable_classes.count} models" message << if execute_in_sequential_tracks? " with #{tracks_count} head jobs" else " with parallel jobs" end message << "\n\t#{encryptable_classes.collect(&:name).join(", ")}\n\n" message << [ "Batch size: #{batch_size}", ("From id: #{from_id}" if from_id), "Tracks count: #{tracks_count}" ].compact.join(" | ") message end