class ErpTechSvcs::FileSupport::S3Manager

Public Class Methods

setup_connection() click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 10
def setup_connection
  @@configuration = YAML::load_file(File.join(Rails.root, 'config', 's3.yml'))[Rails.env]

  # S3 debug logging
  AWS.config(
      :logger => Rails.logger,
      :log_level => :info
  )

  @@s3_connection = AWS::S3.new(
      :access_key_id => @@configuration['access_key_id'],
      :secret_access_key => @@configuration['secret_access_key']
  )

  @@s3_bucket = @@s3_connection.buckets[@@configuration['bucket'].to_sym]
end

Public Instance Methods

bucket() click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 37
def bucket
  @@s3_bucket
end
bucket=(name) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 33
def bucket=(name)
  @@s3_bucket = @@s3_connection.buckets[name.to_sym]
end
buckets() click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 29
def buckets
  @@s3_connection.buckets
end
build_tree(starting_path, options={}) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 171
def build_tree(starting_path, options={})
  node_tree = find_node(starting_path, options)
  node_tree.nil? ? [] : node_tree
end
copy_file(origination_file, path, name) click to toggle source

copy a file

# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 60
def copy_file(origination_file, path, name)
  contents = get_contents(origination_file)

  create_file(path, name, contents)
end
create_file(path, name, content) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 53
def create_file(path, name, content)
  path = path.sub(%r{^/}, '')
  full_filename = (path.blank? ? name : File.join(path, name))
  bucket.objects[full_filename].write(content, {:acl => :public_read})
end
create_folder(path, name) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 66
def create_folder(path, name)
  path = path.sub(%r{^/}, '')
  full_filename = (path.blank? ? name : File.join(path, name))
  folder = full_filename + "/"
  bucket.objects[folder].write('', {:acl => :public_read})
end
delete_file(path, options={}) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 129
def delete_file(path, options={})
  is_directory = File.extname(path).blank?
  path = path.sub(%r{^/}, '')
  result = false
  message = nil
  begin
    bucket.objects.with_prefix(path).delete_all
    message = "File was deleted successfully"
    result = true
  rescue => ex
    result = false
    message = ex
  end

  return result, message, is_directory
end
exists?(path) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 146
def exists?(path)
  begin
    path = path.sub(%r{^/}, '')
    return bucket.objects[path].exists?
  rescue AWS::S3::Errors::NoSuchKey
    return false
  end
end
find_node(path, options={}) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 176
def find_node(path, options={})
  parent = {
      :text => path.split('/').pop,
      :iconCls => "icon-content",
      :leaf => false,
      :id => path,
      :children => []
  }

  #remove proceeding slash for s3
  path.sub!(%r{^/}, '')

  if File.extname(path).blank?
    tree = bucket.as_tree(:prefix => path)

    tree.children.each do |node|
      if node.leaf?
        #ignore current path that comes as leaf from s3
        next if node.key == path + '/'

        leaf_hash = {
            :text => node.key.split('/').pop,
            :downloadPath => "/#{node.key.split('/')[0..-2].join('/')}",
            :id => "/#{node.key}",
            :iconCls => 'icon-document',
            :leaf => true
        }

        if options[:file_asset_holder]
          leaf_hash = apply_file_asset_properties(options[:file_asset_holder], leaf_hash)
        end

        parent[:children] << leaf_hash
      else
        parent[:children] << {
            :iconCls => "icon-content",
            :text => node.prefix.split('/').pop,
            :id => "/#{node.prefix}".chop,
            :leaf => false
        }
      end
    end

  else
    parent[:iconCls] = 'icon-document'
    parent[:leaf] = true
    parent[:downloadPath] = "/#{path.split('/')[0..-2].join('/')}"

    if options[:file_asset_holder]
      parent = apply_file_asset_properties(options[:file_asset_holder], parent)
    end
  end

  # add preceding slash back to parent
  parent[:id] = "/#{parent[:id]}"

  parent
end
get_contents(path) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 155
def get_contents(path)
  contents = nil
  message = nil

  path = path.sub(%r{^/}, '')
  begin
    object = bucket.objects[path]
    contents = object.read
  rescue AWS::S3::Errors::NoSuchKey => error
    contents = ''
    message = FILE_DOES_NOT_EXIST
  end

  return contents, message
end
rename_file(path, name) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 96
def rename_file(path, name)
  result = false
  old_name = File.basename(path)
  path_pieces = path.split('/')
  path_pieces.delete(path_pieces.last)
  path_pieces.push(name)
  new_path = path_pieces.join('/')
  begin
    file = FileAsset.where(:name => ::File.basename(path)).where(:directory => ::File.dirname(path)).first
    acl = (file.is_secured? ? :private : :public_read) unless file.nil?
    options = (file.nil? ? {} : {:acl => acl})
    path = path.sub(%r{^/}, '')
    new_path = new_path.sub(%r{^/}, '')

    old_object = bucket.objects[path]
    if new_object = old_object.move_to(new_path, options)
      message = "#{old_name} was renamed to #{name} successfully"
      result = true
    else
      message = "Error renaming #{old_name}"
    end
  rescue AWS::S3::Errors::NoSuchKey => ex
    message = FILE_FOLDER_DOES_NOT_EXIST
  end

  return result, message
end
root() click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 41
def root
  ''
end
save_move(path, new_parent_path) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 73
def save_move(path, new_parent_path)
  result = false
  unless self.exists? path
    message = FILE_DOES_NOT_EXIST
  else
    file = FileAsset.where(:name => ::File.basename(path)).where(:directory => ::File.dirname(path)).first
    acl = (file.is_secured? ? :private : :public_read) unless file.nil?
    options = (file.nil? ? {} : {:acl => acl})
    name = File.basename(path)
    path = path.sub(%r{^/}, '')
    new_path = File.join(new_parent_path, name).sub(%r{^/}, '')
    old_object = bucket.objects[path]
    if new_object = old_object.move_to(new_path, options)
      message = "#{name} was moved to #{new_path} successfully"
      result = true
    else
      message = "Error moving file #{path}"
    end
  end

  return result, message
end
set_permissions(path, canned_acl=:public_read) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 124
def set_permissions(path, canned_acl=:public_read)
  path = path.sub(%r{^/}, '')
  bucket.objects[path].acl = canned_acl
end
update_file(path, content) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 45
def update_file(path, content)
  file = FileAsset.where(:name => ::File.basename(path)).where(:directory => ::File.dirname(path)).first
  acl = (file.is_secured? ? :private : :public_read) unless file.nil?
  options = (file.nil? ? {} : {:acl => acl, :content_type => file.content_type})
  path = path.sub(%r{^/}, '')
  bucket.objects[path].write(content, options)
end

Private Instance Methods

apply_file_asset_properties(file_asset_holder, hash) click to toggle source
# File lib/erp_tech_svcs/file_support/s3_manager.rb, line 237
def apply_file_asset_properties(file_asset_holder, hash)
  files = file_asset_holder.files

  file = files.find { |file| file.directory == hash[:downloadPath] and file.name == hash[:text] }
  unless file.nil?
    hash[:isSecured] = file.is_secured?
    hash[:roles] = file.roles.collect { |r| r.internal_identifier }
    hash[:iconCls] = 'icon-document_lock' if hash[:isSecured]
    hash[:size] = file.data_file_size
    hash[:width] = file.width
    hash[:height] = file.height
    hash[:url] = file.data.url
  end

  hash
end