Use class instead of module
This commit is contained in:
parent
75915556cb
commit
53256ecc00
@ -5,37 +5,19 @@ require "active_support/core_ext/time/conversions"
|
||||
require "active_support/core_ext/numeric/time"
|
||||
|
||||
module RemoteStorage
|
||||
module Riak
|
||||
class Riak
|
||||
|
||||
::Riak.url_decoding = true
|
||||
|
||||
def client
|
||||
@client ||= ::Riak::Client.new(:host => settings.riak['host'],
|
||||
:http_port => settings.riak['http_port'])
|
||||
end
|
||||
attr_accessor :settings, :server
|
||||
|
||||
def data_bucket
|
||||
@data_bucket ||= client.bucket(settings.riak['buckets']['data'])
|
||||
end
|
||||
|
||||
def directory_bucket
|
||||
@directory_bucket ||= client.bucket(settings.riak['buckets']['directories'])
|
||||
end
|
||||
|
||||
def auth_bucket
|
||||
@auth_bucket ||= client.bucket(settings.riak['buckets']['authorizations'])
|
||||
end
|
||||
|
||||
def binary_bucket
|
||||
@binary_bucket ||= client.bucket(settings.riak['buckets']['binaries'])
|
||||
end
|
||||
|
||||
def opslog_bucket
|
||||
@opslog_bucket ||= client.bucket(settings.riak['buckets']['opslog'])
|
||||
def initialize(settings, server)
|
||||
self.settings = settings
|
||||
self.server = server
|
||||
end
|
||||
|
||||
def authorize_request(user, directory, token, listing=false)
|
||||
request_method = env["REQUEST_METHOD"]
|
||||
request_method = server.env["REQUEST_METHOD"]
|
||||
|
||||
if directory.split("/").first == "public"
|
||||
return true if request_method == "GET" && !listing
|
||||
@ -44,19 +26,19 @@ module RemoteStorage
|
||||
authorizations = auth_bucket.get("#{user}:#{token}").data
|
||||
permission = directory_permission(authorizations, directory)
|
||||
|
||||
halt 403 unless permission
|
||||
server.halt 403 unless permission
|
||||
if ["PUT", "DELETE"].include? request_method
|
||||
halt 403 unless permission == "rw"
|
||||
server.halt 403 unless permission == "rw"
|
||||
end
|
||||
rescue ::Riak::HTTPFailedRequest
|
||||
halt 403
|
||||
server.halt 403
|
||||
end
|
||||
|
||||
def get_data(user, directory, key)
|
||||
object = data_bucket.get("#{user}:#{directory}:#{key}")
|
||||
|
||||
headers["Content-Type"] = object.content_type
|
||||
headers["Last-Modified"] = last_modified_date_for(object)
|
||||
server.headers["Content-Type"] = object.content_type
|
||||
server.headers["Last-Modified"] = last_modified_date_for(object)
|
||||
|
||||
if binary_link = object.links.select {|l| l.tag == "binary"}.first
|
||||
object = client[binary_link.bucket].get(binary_link.key)
|
||||
@ -69,21 +51,21 @@ module RemoteStorage
|
||||
return serializer_for(object.content_type) ? object.data : object.raw_data
|
||||
end
|
||||
rescue ::Riak::HTTPFailedRequest
|
||||
halt 404
|
||||
server.halt 404
|
||||
end
|
||||
|
||||
def get_directory_listing(user, directory)
|
||||
directory_object = directory_bucket.get("#{user}:#{directory}")
|
||||
timestamp = directory_object.data.to_i
|
||||
timestamp /= 1000 if timestamp.to_s.length == 13
|
||||
headers["Content-Type"] = "application/json"
|
||||
headers["Last-Modified"] = Time.at(timestamp).to_s(:rfc822)
|
||||
server.headers["Content-Type"] = "application/json"
|
||||
server.headers["Last-Modified"] = Time.at(timestamp).to_s(:rfc822)
|
||||
|
||||
listing = directory_listing(user, directory)
|
||||
|
||||
return listing.to_json
|
||||
rescue ::Riak::HTTPFailedRequest
|
||||
headers["Content-Type"] = "application/json"
|
||||
server.headers["Content-Type"] = "application/json"
|
||||
return "{}"
|
||||
end
|
||||
|
||||
@ -97,10 +79,10 @@ module RemoteStorage
|
||||
object.meta["timestamp"] = timestamp
|
||||
|
||||
if binary_data?(object.content_type, data)
|
||||
save_binary_data(object, data) or halt 422
|
||||
save_binary_data(object, data) or server.halt 422
|
||||
new_object_size = data.size
|
||||
else
|
||||
set_object_data(object, data) or halt 422
|
||||
set_object_data(object, data) or server.halt 422
|
||||
new_object_size = object.raw_data.size
|
||||
end
|
||||
|
||||
@ -111,9 +93,9 @@ module RemoteStorage
|
||||
|
||||
update_all_directory_objects(user, directory, timestamp)
|
||||
|
||||
halt 200
|
||||
server.halt 200
|
||||
rescue ::Riak::HTTPFailedRequest
|
||||
halt 422
|
||||
server.halt 422
|
||||
end
|
||||
|
||||
def delete_data(user, directory, key)
|
||||
@ -133,12 +115,11 @@ module RemoteStorage
|
||||
timestamp = (Time.now.to_f * 1000).to_i
|
||||
delete_or_update_directory_objects(user, directory, timestamp)
|
||||
|
||||
halt riak_response[:code]
|
||||
server.halt riak_response[:code]
|
||||
rescue ::Riak::HTTPFailedRequest
|
||||
halt 404
|
||||
server.halt 404
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def extract_category(directory)
|
||||
@ -175,7 +156,7 @@ module RemoteStorage
|
||||
|
||||
def object_size(object)
|
||||
if binary_link = object.links.select {|l| l.tag == "binary"}.first
|
||||
response = head(settings.riak['buckets']['binaries'], escape(binary_link.key))
|
||||
response = head(settings['buckets']['binaries'], escape(binary_link.key))
|
||||
response[:headers]["content-length"].first.to_i
|
||||
else
|
||||
object.raw_data.nil? ? 0 : object.raw_data.size
|
||||
@ -196,7 +177,7 @@ module RemoteStorage
|
||||
|
||||
# A URI object that can be used with HTTP backend methods
|
||||
def riak_uri(bucket, key)
|
||||
rc = settings.riak.symbolize_keys
|
||||
rc = settings.symbolize_keys
|
||||
URI.parse "http://#{rc[:host]}:#{rc[:http_port]}/riak/#{bucket}/#{key}"
|
||||
end
|
||||
|
||||
@ -406,5 +387,30 @@ module RemoteStorage
|
||||
|
||||
parent_directories << ""
|
||||
end
|
||||
|
||||
def client
|
||||
@client ||= ::Riak::Client.new(:host => settings['host'],
|
||||
:http_port => settings['http_port'])
|
||||
end
|
||||
|
||||
def data_bucket
|
||||
@data_bucket ||= client.bucket(settings['buckets']['data'])
|
||||
end
|
||||
|
||||
def directory_bucket
|
||||
@directory_bucket ||= client.bucket(settings['buckets']['directories'])
|
||||
end
|
||||
|
||||
def auth_bucket
|
||||
@auth_bucket ||= client.bucket(settings['buckets']['authorizations'])
|
||||
end
|
||||
|
||||
def binary_bucket
|
||||
@binary_bucket ||= client.bucket(settings['buckets']['binaries'])
|
||||
end
|
||||
|
||||
def opslog_bucket
|
||||
@opslog_bucket ||= client.bucket(settings['buckets']['opslog'])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -36,13 +36,6 @@ class LiquorCabinet < Sinatra::Base
|
||||
enable :logging
|
||||
end
|
||||
|
||||
if settings.riak
|
||||
include RemoteStorage::Riak
|
||||
# elsif settings.redis
|
||||
# include RemoteStorage::Redis
|
||||
# end
|
||||
end
|
||||
|
||||
#
|
||||
# Cabinet doors
|
||||
#
|
||||
@ -64,7 +57,7 @@ class LiquorCabinet < Sinatra::Base
|
||||
|
||||
token = env["HTTP_AUTHORIZATION"] ? env["HTTP_AUTHORIZATION"].split(" ")[1] : ""
|
||||
|
||||
authorize_request(@user, @directory, token, @key.blank?) unless request.options?
|
||||
storage.authorize_request(@user, @directory, token, @key.blank?) unless request.options?
|
||||
end
|
||||
|
||||
options path do
|
||||
@ -74,7 +67,7 @@ class LiquorCabinet < Sinatra::Base
|
||||
|
||||
["/:user/*/:key", "/:user/:key"].each do |path|
|
||||
get path do
|
||||
get_data(@user, @directory, @key)
|
||||
storage.get_data(@user, @directory, @key)
|
||||
end
|
||||
|
||||
put path do
|
||||
@ -86,17 +79,29 @@ class LiquorCabinet < Sinatra::Base
|
||||
content_type = env['CONTENT_TYPE']
|
||||
end
|
||||
|
||||
put_data(@user, @directory, @key, data, content_type)
|
||||
storage.put_data(@user, @directory, @key, data, content_type)
|
||||
end
|
||||
|
||||
delete path do
|
||||
delete_data(@user, @directory, @key)
|
||||
storage.delete_data(@user, @directory, @key)
|
||||
end
|
||||
end
|
||||
|
||||
["/:user/*/", "/:user/"].each do |path|
|
||||
get path do
|
||||
get_directory_listing(@user, @directory)
|
||||
storage.get_directory_listing(@user, @directory)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def storage
|
||||
@storage ||= begin
|
||||
if settings.riak
|
||||
RemoteStorage::Riak.new(settings.riak, self)
|
||||
# elsif settings.redis
|
||||
# include RemoteStorage::Redis
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user