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