class Paperbin::Handler

Public Instance Methods

archive_path() click to toggle source
# File lib/paperbin/handler.rb, line 44
def archive_path
  File.join(directory_path, "#{archive_split_id}.zip")
end
archive_split_id() click to toggle source
# File lib/paperbin/handler.rb, line 17
def archive_split_id
  split.last
end
check_versions() click to toggle source
# File lib/paperbin/handler.rb, line 152
def check_versions
  versions.each_with_index do |version, index|
    # check both file exist or not
    next unless files_exist?(md5_file_path(version), json_file_path(version))

    if md5_valid?(version)
      process_valid_records(version, versions.last)
    else
      # remove both files
      [json_file_path(version), md5_file_path(version)].each do |f|
        File.delete(f)
      end
      raise Errno::ENOENT
    end
  end
rescue Errno::ENOENT
  # lodge worker unless valid
  Paperbin::WriteWorker.perform_async(id, type)
end
create_archive_file() click to toggle source
# File lib/paperbin/handler.rb, line 48
def create_archive_file
  unless File.exists?(archive_path)
    Zippy.create archive_path do |z|
      z["created_at.txt"] = Date.today.to_s
      handle_old_files(z)
    end
  end
end
create_directory() click to toggle source
# File lib/paperbin/handler.rb, line 81
def create_directory
  FileUtils.mkdir_p(directory_path) unless Dir.exists?(directory_path)
end
dir_split_id() click to toggle source
# File lib/paperbin/handler.rb, line 13
def dir_split_id
  split[0...-1]
end
directory_path() click to toggle source
# File lib/paperbin/handler.rb, line 31
def directory_path
  dirs = []
  dirs << options[:path]
  dirs << item.send(options[:base_scope])
  dirs << type
  dirs += dir_split_id
  File.join(dirs.map(&:to_s))
end
files_exist?(*args) click to toggle source
# File lib/paperbin/handler.rb, line 101
def files_exist?(*args)
  Array(args).map{|file| File.exist?(file)}.all?
end
formatted_id() click to toggle source
# File lib/paperbin/handler.rb, line 5
def formatted_id
  "%012d" % id
end
generate_files() click to toggle source
# File lib/paperbin/handler.rb, line 125
def generate_files
  versions.each do |version|
    write_json_file version
    write_md5_file version
  end
end
handle_old_files(z) click to toggle source
# File lib/paperbin/handler.rb, line 57
def handle_old_files(z)
  if File.directory?(old_directory_path)
    Dir.new(old_directory_path).each do |file|
      if file =~ /\.gz/
        name = file.split(".").first
        z["#{name}.json"] = Zlib::GzipReader.open(File.join(old_directory_path, file)) {|gz| gz.read }
      end
    end
    FileUtils.remove_dir(old_directory_path)
  end
end
item() click to toggle source
# File lib/paperbin/handler.rb, line 25
def item
  scope = type.constantize
  scope = scope.with_deleted if scope.respond_to?(:with_deleted)
  scope.where(id: id).first
end
json_file(version) click to toggle source
# File lib/paperbin/handler.rb, line 93
def json_file(version)
  "#{version.id}.json"
end
json_file_path(version, checked = false) click to toggle source
# File lib/paperbin/handler.rb, line 97
def json_file_path(version, checked = false)
  File.join(directory_path, "#{json_file(version)}#{checked ? '' : '.unchecked'}")
end
md5_file(version) click to toggle source
# File lib/paperbin/handler.rb, line 85
def md5_file(version)
  "#{version.id}.md5"
end
md5_file_path(version) click to toggle source
# File lib/paperbin/handler.rb, line 89
def md5_file_path(version)
  File.join(directory_path, "#{md5_file(version)}")
end
md5_valid?(version) click to toggle source
# File lib/paperbin/handler.rb, line 105
def md5_valid?(version)
  record_md5 = File.read(md5_file_path(version))
  data = File.open(json_file_path(version), "r") { |f| f.read }
  check_md5 = Digest::MD5.hexdigest(data)
  record_md5 == check_md5
end
old_directory_path() click to toggle source
# File lib/paperbin/handler.rb, line 40
def old_directory_path
  File.join(directory_path, archive_split_id)
end
options() click to toggle source
# File lib/paperbin/handler.rb, line 21
def options
  Paperbin::Config.default_options
end
process_valid_records(version, last_item) click to toggle source
# File lib/paperbin/handler.rb, line 112
def process_valid_records(version, last_item)
  # remove records from db expcet the lastest one
  version.delete unless version == last_item
  # rename file extension
  File.rename(json_file_path(version), json_file_path(version, true))
  Zippy.open(archive_path) do |z|
    z["#{json_file(version).to_s}"] = File.open(json_file_path(version, true)) { |f| f.read }
  end
  File.delete(md5_file_path(version))
  File.delete(json_file_path(version, true))
  options[:callback].call(json_file_path(version, true)) if options[:callback]
end
save_versions() click to toggle source
# File lib/paperbin/handler.rb, line 73
def save_versions
  return true unless item
  create_directory
  create_archive_file
  generate_files
  Paperbin::CheckWorker.perform_async(id, type)
end
split() click to toggle source
# File lib/paperbin/handler.rb, line 9
def split
  formatted_id.scan(/.{4}/)
end
string_data(version) click to toggle source
# File lib/paperbin/handler.rb, line 148
def string_data(version)
  version.to_json
end
versions() click to toggle source
# File lib/paperbin/handler.rb, line 69
def versions
  PaperTrail::Version.where(item_type: type, item_id: id)
end
write_json_file(version) click to toggle source
# File lib/paperbin/handler.rb, line 132
def write_json_file(version)
  path = json_file_path version
  unless files_exist?(path)
    File.open(path, "w") { |f| f.write(string_data(version)) }
    timestamp = version.created_at.to_time
    File.utime timestamp, timestamp, path
  end
end
write_md5_file(version) click to toggle source
# File lib/paperbin/handler.rb, line 141
def write_md5_file(version)
  File.open(md5_file_path(version), "w") do |file|
    md5 = Digest::MD5.hexdigest(string_data(version))
    file.write md5
  end
end