class Saviour::LifeCycle::FileUpdater

Public Class Methods

new(current_path, file, column, connection) click to toggle source
# File lib/saviour/life_cycle.rb, line 31
def initialize(current_path, file, column, connection)
  @file = file
  @column = column
  @current_path = current_path
  @connection = connection
end

Public Instance Methods

upload() click to toggle source
# File lib/saviour/life_cycle.rb, line 38
def upload
  dup_temp_path = SecureRandom.hex

  dup_file = proc do
    uploader.storage.cp @current_path, dup_temp_path

    DbHelpers.run_after_commit(@connection) do
      uploader.storage.delete dup_temp_path
    end

    DbHelpers.run_after_rollback(@connection) do
      uploader.storage.mv dup_temp_path, @current_path
    end
  end

  @new_path = @file.write(
    before_write: ->(path) { dup_file.call if @current_path == path }
  )

  return unless @new_path

  if @current_path && @current_path != @new_path
    DbHelpers.run_after_commit(@connection) do
      uploader.storage.delete(@current_path)
    end
  end

  # Delete the newly uploaded file only if it's an update in a different path
  if @current_path.nil? || @current_path != @new_path
    DbHelpers.run_after_rollback(@connection) do
      uploader.storage.delete(@new_path)
    end
  end

  [@column, @new_path]
end
uploader() click to toggle source
# File lib/saviour/life_cycle.rb, line 75
def uploader
  @file.uploader
end