Determine correct metadata key for objects in root dir

This commit is contained in:
Garret Alfert 2016-03-04 20:47:41 +01:00
parent 1c0bd18915
commit 3590b7dedc
2 changed files with 33 additions and 4 deletions

View File

@ -133,7 +133,7 @@ module RemoteStorage
server.halt 400 if server.env["HTTP_CONTENT_RANGE"] server.halt 400 if server.env["HTTP_CONTENT_RANGE"]
server.halt 409 if has_name_collision?(user, directory, key) server.halt 409 if has_name_collision?(user, directory, key)
existing_metadata = redis.hgetall "rs:m:#{user}:#{directory}/#{key}" existing_metadata = redis.hgetall redis_metadata_object_key(user, directory, key)
url = url_for_key(user, directory, key) url = url_for_key(user, directory, key)
if required_match = server.env["HTTP_IF_MATCH"] if required_match = server.env["HTTP_IF_MATCH"]
@ -309,7 +309,7 @@ module RemoteStorage
end end
def update_metadata_object(user, directory, key, metadata) def update_metadata_object(user, directory, key, metadata)
redis_key = "rs:m:#{user}:#{directory}/#{key}" redis_key = redis_metadata_object_key(user, directory, key)
redis.hmset(redis_key, *metadata) redis.hmset(redis_key, *metadata)
redis.sadd "rs:m:#{user}:#{directory}/:items", key redis.sadd "rs:m:#{user}:#{directory}/:items", key
@ -328,8 +328,7 @@ module RemoteStorage
end end
def delete_metadata_objects(user, directory, key) def delete_metadata_objects(user, directory, key)
redis_key = "rs:m:#{user}:#{directory}/#{key}" redis.del redis_metadata_object_key(user, directory, key)
redis.del(redis_key)
redis.srem "rs:m:#{user}:#{directory}/:items", key redis.srem "rs:m:#{user}:#{directory}/:items", key
end end
@ -353,6 +352,10 @@ module RemoteStorage
redis.smembers("rs:m:#{user}:#{dir}/:items").empty? redis.smembers("rs:m:#{user}:#{dir}/:items").empty?
end end
def redis_metadata_object_key(user, directory, key)
"rs:m:#{user}:#{[directory, key].delete_if(&:empty?).join("/")}"
end
def container_url_for(user) def container_url_for(user)
"#{base_url}/#{container_for(user)}" "#{base_url}/#{container_for(user)}"
end end

View File

@ -74,6 +74,32 @@ describe "App" do
root_items.must_equal ["food/"] root_items.must_equal ["food/"]
end end
describe "objects in root dir" do
before do
put_stub = OpenStruct.new(headers: {
etag: "bla",
last_modified: "Fri, 04 Mar 2016 12:20:18 GMT"
})
RestClient.stub :put, put_stub do
put "/phil/bamboo.txt", "shir kan"
end
end
it "are listed in the directory listing with all metadata" do
get "phil/"
last_response.status.must_equal 200
last_response.content_type.must_equal "application/json"
content = JSON.parse(last_response.body)
content["items"]["bamboo.txt"].wont_be_nil
content["items"]["bamboo.txt"]["ETag"].must_equal "bla"
content["items"]["bamboo.txt"]["Content-Type"].must_equal "text/plain; charset=utf-8"
content["items"]["bamboo.txt"]["Content-Length"].must_equal 8
end
end
describe "name collision checks" do describe "name collision checks" do
it "is successful when there is no name collision" do it "is successful when there is no name collision" do
put_stub = OpenStruct.new(headers: { put_stub = OpenStruct.new(headers: {