class OmniFiles::Storage

Public Class Methods

new(mongo_host, mongo_port, mongo_name, logger) click to toggle source
# File lib/omnifiles/storage.rb, line 11
def initialize mongo_host, mongo_port, mongo_name, logger
    @logger = logger
    db = Mongo::Client.new([ mongo_host + ':' + mongo_port.to_s ], :database => mongo_name)
    raise 'No mongo found' unless db
    @coll = db[:files]
    raise 'Cannot use collection' unless @coll

    @shortener = UrlShortener.new(SecureRandom.hex(8), 1)
end

Public Instance Methods

delete_file(shortened) click to toggle source
# File lib/omnifiles/storage.rb, line 57
def delete_file shortened
    resp = @coll.delete_many(shortened: shortened)
    resp.ok? && resp.n > 0
end
enumerate_docs() { |doc| ... } click to toggle source
# File lib/omnifiles/storage.rb, line 62
def enumerate_docs
    @coll.find.each { |doc| yield doc }
end
get_file(shortened) click to toggle source

returns full url

# File lib/omnifiles/storage.rb, line 45
def get_file shortened
    @coll.find(shortened: shortened).limit(1).first
end
get_file_and_bump(shortened) click to toggle source

returns full url and update statistics

# File lib/omnifiles/storage.rb, line 50
def get_file_and_bump shortened
    @coll.find_one_and_update({ shortened: shortened },
                              { "$inc" =>  { "accessed.count" => 1 },
                                "$set" => { "accessed.time" => Time.now.utc } },
                              return_document: :after )
end
put_file(shortened, filename, mime) click to toggle source
# File lib/omnifiles/storage.rb, line 37
def put_file shortened, filename, mime
    doc = { original_filename: filename, shortened: shortened, mime: mime,
            accessed: { count: 0 }, created: { time: Time.now.utc } }
    res = @coll.insert_one(doc)
    @logger.info "mongo put result: #{res}"
end
shorten_file(sample, filename, mime) click to toggle source

returns shortened url

# File lib/omnifiles/storage.rb, line 22
def shorten_file sample, filename, mime
  counter = 0
  begin
    # filename can be null
    hashing = [filename.to_s, mime, sample, counter.to_s].join '|'
    @logger.info "Hashing value " + hashing
    shortened = @shortener.shorten hashing
    counter += 1
    next if shortened.size < 5
    same_shortened = @coll.find(shortened: shortened).count > 0
    raise 'Something goes wrong' if counter > 100
  end while same_shortened
  shortened
end