New API
This commit is contained in:
parent
1cca04a18a
commit
8c0a7b1f14
@ -111,7 +111,7 @@ def file_transfer(client : IPC::Client, file : File, file_info : FileStorage::Fi
|
|||||||
buffer_size = 1_000
|
buffer_size = 1_000
|
||||||
|
|
||||||
buffer = Bytes.new buffer_size
|
buffer = Bytes.new buffer_size
|
||||||
counter = 1
|
counter = 0
|
||||||
size = 0
|
size = 0
|
||||||
|
|
||||||
while (size = file.read(buffer)) > 0
|
while (size = file.read(buffer)) > 0
|
||||||
|
@ -97,7 +97,7 @@ module FileStorage
|
|||||||
property mid : String # autogenerated
|
property mid : String # autogenerated
|
||||||
property file : FileInfo
|
property file : FileInfo
|
||||||
|
|
||||||
def initialize(@file)
|
def initialize(@file : FileInfo)
|
||||||
@mid = UUID.random.to_s
|
@mid = UUID.random.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -177,7 +177,7 @@ module FileStorage
|
|||||||
|
|
||||||
@filedigest = file_info.digest
|
@filedigest = file_info.digest
|
||||||
@data = Base64.encode bindata
|
@data = Base64.encode bindata
|
||||||
@chunk = FileStorage::Chunk.new count, file_info.nb_chunks, @data
|
@chunk = FileStorage::Chunk.new count, file_info.nb_chunks - 1, @data
|
||||||
@mid = UUID.random.to_s
|
@mid = UUID.random.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -4,7 +4,7 @@ def remove_chunk_from_db(transfer_info : TransferInfo, chunk_number : Int32)
|
|||||||
Context.db_by_filedigest.update transfer_info.file_info.digest, transfer_info
|
Context.db_by_filedigest.update transfer_info.file_info.digest, transfer_info
|
||||||
end
|
end
|
||||||
|
|
||||||
def write_a_chunk(userid : String, file_info : FileInfo, chunk_number : Int32, data : Bytes)
|
def write_a_chunk(userid : String, file_info : FileStorage::FileInfo, chunk_number : Int32, data : Bytes)
|
||||||
|
|
||||||
# storage: Context.storage_directory/userid/fileuuid.bin
|
# storage: Context.storage_directory/userid/fileuuid.bin
|
||||||
dir = "#{Context.storage_directory}/#{userid}"
|
dir = "#{Context.storage_directory}/#{userid}"
|
||||||
|
@ -20,22 +20,26 @@ def hdl_transfer(message : FileStorage::Transfer, user : User) : FileStorage::Re
|
|||||||
# Get the transfer info from the db
|
# Get the transfer info from the db
|
||||||
transfer_info = Context.db_by_filedigest.get message.filedigest
|
transfer_info = Context.db_by_filedigest.get message.filedigest
|
||||||
|
|
||||||
# TODO: if we don't have the information
|
|
||||||
if transfer_info.nil?
|
if transfer_info.nil?
|
||||||
# TODO
|
# The user has to send an upload request before sending anything
|
||||||
|
# If not the case, it should be discarded
|
||||||
|
raise "file not recorded"
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: verify that the chunk sent was really missing
|
chunk_number = message.chunk.n
|
||||||
chunk_number = message.chunk.n - 1
|
|
||||||
|
|
||||||
# TODO: verify the digest
|
|
||||||
|
|
||||||
data = Base64.decode message.data
|
data = Base64.decode message.data
|
||||||
write_a_chunk user.uid.to_s, transfer_info.file_info, chunk_number, data
|
|
||||||
|
|
||||||
# TODO: register the file with dodb, with its tags
|
# TODO: verify that the chunk sent was really missing
|
||||||
|
if transfer_info.chunks.select(chunk_number).size > 0
|
||||||
|
write_a_chunk user.uid.to_s, transfer_info.file_info, chunk_number, data
|
||||||
|
else
|
||||||
|
raise "non existent chunk or already uploaded"
|
||||||
|
end
|
||||||
|
|
||||||
remove_chunk_from_db transfer_info, message.chunk.n
|
remove_chunk_from_db transfer_info, chunk_number
|
||||||
|
|
||||||
|
# TODO: verify the digest, if no more chunks
|
||||||
|
|
||||||
FileStorage::Response.new mid, "Ok"
|
FileStorage::Response.new mid, "Ok"
|
||||||
|
|
||||||
@ -44,23 +48,45 @@ rescue e
|
|||||||
FileStorage::Response.new mid.not_nil!, "Not Ok", "Unexpected error: #{e.message}"
|
FileStorage::Response.new mid.not_nil!, "Not Ok", "Unexpected error: #{e.message}"
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO
|
|
||||||
# the client sent an upload request
|
# the client sent an upload request
|
||||||
def hdl_upload(request : FileStorage::UploadRequest,
|
def hdl_upload(request : FileStorage::UploadRequest, user : User) : FileStorage::Response
|
||||||
user : User,
|
|
||||||
event : IPC::Event::Message) : FileStorage::Response
|
mid = request.mid
|
||||||
|
mid ||= "no message id"
|
||||||
|
|
||||||
puts "hdl upload: mid=#{request.mid}"
|
puts "hdl upload: mid=#{request.mid}"
|
||||||
pp! request
|
pp! request
|
||||||
|
|
||||||
|
# TODO: verify the rights and quotas of the user
|
||||||
|
|
||||||
|
# First: check if the file already exists
|
||||||
|
transfer_info = Context.db_by_filedigest.get request.file.digest
|
||||||
|
if transfer_info.nil?
|
||||||
|
# In case file informations aren't already registered
|
||||||
|
# which is normal at this point
|
||||||
|
transfer_info = TransferInfo.new user.uid, request.file
|
||||||
|
Context.db << transfer_info
|
||||||
|
else
|
||||||
|
# File information already exists, request may be duplicated
|
||||||
|
# In this case: ignore the upload request
|
||||||
|
end
|
||||||
|
|
||||||
|
# file_info.name
|
||||||
|
# file_info.size
|
||||||
|
# file_info.nb_chunks
|
||||||
|
# file_info.digest
|
||||||
|
# file_info.tags
|
||||||
|
|
||||||
FileStorage::Response.new request.mid, "Upload OK"
|
FileStorage::Response.new request.mid, "Upload OK"
|
||||||
|
rescue e
|
||||||
|
puts "Error handling transfer: #{e.message}"
|
||||||
|
FileStorage::Response.new mid.not_nil!, "Not Ok", "Unexpected error: #{e.message}"
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
# the client sent a download request
|
# the client sent a download request
|
||||||
def hdl_download(request : FileStorage::DownloadRequest,
|
def hdl_download(request : FileStorage::DownloadRequest,
|
||||||
user : User,
|
user : User) : FileStorage::Response
|
||||||
event : IPC::Event::Message) : FileStorage::Response
|
|
||||||
|
|
||||||
puts "hdl download: mid=#{request.mid}"
|
puts "hdl download: mid=#{request.mid}"
|
||||||
pp! request
|
pp! request
|
||||||
@ -82,9 +108,9 @@ def hdl_requests(requests : Array(FileStorage::Request),
|
|||||||
requests.each do |request|
|
requests.each do |request|
|
||||||
case request
|
case request
|
||||||
when FileStorage::DownloadRequest
|
when FileStorage::DownloadRequest
|
||||||
responses << hdl_download request, user, event
|
responses << hdl_download request, user
|
||||||
when FileStorage::UploadRequest
|
when FileStorage::UploadRequest
|
||||||
responses << hdl_upload request, user, event
|
responses << hdl_upload request, user
|
||||||
else
|
else
|
||||||
raise "request not understood"
|
raise "request not understood"
|
||||||
end
|
end
|
||||||
|
@ -62,7 +62,7 @@ Context.service.not_nil!.loop do |event|
|
|||||||
request = FileStorage::UploadRequest.from_json(
|
request = FileStorage::UploadRequest.from_json(
|
||||||
String.new event.message.payload
|
String.new event.message.payload
|
||||||
)
|
)
|
||||||
response = hdl_upload request, Context.users_status[userid], event
|
response = hdl_upload request, Context.users_status[userid]
|
||||||
|
|
||||||
do_response event, response
|
do_response event, response
|
||||||
when .download_request?
|
when .download_request?
|
||||||
@ -70,7 +70,7 @@ Context.service.not_nil!.loop do |event|
|
|||||||
request = FileStorage::DownloadRequest.from_json(
|
request = FileStorage::DownloadRequest.from_json(
|
||||||
String.new event.message.payload
|
String.new event.message.payload
|
||||||
)
|
)
|
||||||
response = hdl_download request, Context.users_status[userid], event
|
response = hdl_download request, Context.users_status[userid]
|
||||||
|
|
||||||
do_response event, response
|
do_response event, response
|
||||||
when .response?
|
when .response?
|
||||||
@ -91,7 +91,7 @@ Context.service.not_nil!.loop do |event|
|
|||||||
transfer = FileStorage::Transfer.from_json(
|
transfer = FileStorage::Transfer.from_json(
|
||||||
String.new event.message.payload
|
String.new event.message.payload
|
||||||
)
|
)
|
||||||
response = hdl_transfer transfer, Context.users_status[userid], event
|
response = hdl_transfer transfer, Context.users_status[userid]
|
||||||
|
|
||||||
do_response event, response
|
do_response event, response
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user