class FileStorage::Request JSONIPC.request Download, 30 do property mid : String # autogenerated property filedigest : String? # SHA256 digest of the file, used as ID property name : String? property tags : Array(String)? def initialize(@filedigest = nil, @name = nil, @tags = nil) @mid = UUID.random.to_s end def handle(filestoraged : FileStorage::Service, event : IPC::Event::Events) user = filestoraged.get_logged_user event raise Exception.new "unauthorized" if user.nil? # FIXME: Maybe this should be moved to FileStorage::Service fd = event.connection.fd user_data = filestoraged.get_user_data user.uid filestoraged.storage.download self, user_data rescue e return Response::Error.new @mid, "unauthorized" end end FileStorage.requests << Download end class FileStorage::Client def download(filedigest = nil, name = nil, tags = nil) request = FileStorage::Request::Download.new filedigest, name, tags send request response = parse_message [ FileStorage::Response::Download, FileStorage::Response::Error ], read case response when FileStorage::Response::Download when FileStorage::Response::Error raise "Download request denied: #{response.reason}" end response end end class FileStorage::Response JSONIPC.request Download, 30 do property mid : String def initialize(@mid) end end end