diff --git a/proto/caosdb/entity/v1alpha1/main.proto b/proto/caosdb/entity/v1alpha1/main.proto index 91450968c89fbc800c3ed6fb90208e6f0f32baab..ee768d055a2ee8211dd02c790653c024f01ac869 100644 --- a/proto/caosdb/entity/v1alpha1/main.proto +++ b/proto/caosdb/entity/v1alpha1/main.proto @@ -344,6 +344,39 @@ message Entity { // related to the transaction or the new state of the entity itself or in // relation to other entities or the server's state or configuration. repeated Message infos = 13; + + // File meta data. The actual binary data has to uploaded or downloaded using the File message. + FileDescriptor file_descriptor = 14; +} + +// The file descriptor contains the meta data of the file which describes the +// file and where the binary data can be retrieved. +message FileDescriptor { + // The corresponding file entity. + string entity_id = 1; + // The path of this file in the internal file system. + string path = 2; + // The size of the file + int64 size = 3; + // Hash sums for consistency checks + repeated Hash hashes = 4; +} + +// This represents a hash sum of a file. +message Hash { + // The algorithm of the hash sum, e.g. SHA512 + string algorithm = 1; + // The value of the hash sum + string value = 2; +} + +// Wraps an entity a associates it with a file_upload +message EntityRequest { + // The entity. + Entity entity = 1; + // The transmission id (if any). Note: upload_ids are only meaningful for + // File entities. + FileTransmissionId upload_id = 2; } // Property of an entity. Don't confuse with an Entity with role="Property" @@ -457,9 +490,9 @@ message TransactionRequest { // Single request for a retrieve transaction. QueryOrIdRequest retrieve_request = 1; // Single request for an update transaction. - Entity update_request = 2; + EntityRequest update_request = 2; // Single request for an insert transaction. - Entity insert_request = 3; + EntityRequest insert_request = 3; // Single request for a delete transaction. QueryOrIdRequest delete_request = 4; } @@ -502,3 +535,191 @@ service EntityTransactionService { rpc MultiTransaction(MultiTransactionRequest) returns (MultiTransactionResponse); } + +//////////////////////////////////////////////////////////////////////////// +//////////// FILE UPLOAD/DOWNLOAD +//////////////////////////////////////////////////////////////////////////// + +// Indicates whether a registration (for upload or download) has been accepted +// or rejected. +enum RegistrationStatus { + // The registration status is unspecified. + REGISTRATION_STATUS_UNSPECIFIED = 0; + // The registration has been accepted and the client may proceed with the + // actual transmissions. + REGISTRATION_STATUS_ACCEPTED = 1; + // The registration has been rejected and the client should not try to + // proceed with the transmission. + REGISTRATION_STATUS_REJECTED = 2; +} + +// Indicates the state of an upload or a download (a stream of chunks). +enum TransmissionStatus { + // The transmission status is unspecified. + TRANSMISSION_STATUS_UNSPECIFIED = 0; + // The transmission has been successful. + TRANSMISSION_STATUS_SUCCESS = 1; + // The transmission terminated with errors. + TRANSMISSION_STATUS_ERROR = 2; + // The transmission is incomplete and the client may send/request the next chunk. + TRANSMISSION_STATUS_GO_ON = 3; +} + +// Register a file upload indicating the total size if possible. +message RegisterFileUploadRequest { + // Estimated total size of the upload. + int64 total_size = 1; +} + +// Response of the file server upon an upload registration request. +message RegisterFileUploadResponse { + // Whether the server accepted or rejected the registration. + RegistrationStatus status = 1; + // The registration id is used to identify chunks and files which belong to the same upload . + string registration_id = 2; + // The server's maximum number of parallel uploads. Requesting more uploads has undefined behavior. + int32 max_parallel_transmissions = 3; + // The server's maximum chunk size. Submitting bigger chunks has undefined behavior. + int64 max_chunk_size = 4; + // The server's maximum file size. Submitting bigger files has undefined behavior. + int64 max_file_size = 5; +} + +// Represents a download request. +message RegisterFileDownloadRequest { + // The files requested for download. + repeated FileIdentifier files = 1; + // The server's maximum chunk size. Submitting bigger chunks has undefined + // behavior. + int64 max_chunk_size = 4; + // The server's maximum file size. Submitting bigger files has undefined + // behavior. + int64 max_file_size = 5; +} + +// Identifies a file which is to be downloaded. +message FileIdentifier { + // Wraps several identifiers in order to have them as a repeatable field in other messages. + oneof wrapped_identifier { + // An entity id. + string entity_id = 1; + // A path in the internal file system + string path = 2; + } +} + +// Metadata and status information of a file which is about to be downloaded. +message FileDownloadHeader { + // The file identifier exactly as it has been requested during a + // RegisterFileDownloadRequest. + FileIdentifier id = 1; + // The file descriptor of the file. + FileDescriptor file_descriptor = 2; + // Errors for this file (e.g. MESSAGE_CODE_ENTITY_DOES_NOT_EXIST, or + // MESSAGE_CODE_FILE_NOT_FOUND). + repeated Message errors = 3; + // Warnings for this file. + repeated Message warnings = 4; + // Info messages for this file. + repeated Message infos = 5; +} + + +// Response to a download registration request. +message RegisterFileDownloadResponse { + // Whether the server accepted or rejected the registration. + RegistrationStatus status = 1; + // The registration id is used to identify chunks and files which belong to + // the same upload . + string registration_id = 2; + // The server's maximum number of parallel downloads. Starting more parallel + // uploads has undefined behavior. + int32 max_parallel_transmissions = 3; + // The estimated total size of the downloaded files. + int64 total_size = 4; +} + +// Stores a single chunk of a file +message FileChunk { + // Chunk metadata. + FileChunkMetadata metadata = 1; + // Chunk id. + FileChunkId id = 2; + // Binary data of a chunk. + bytes data = 5; +} + +// Identifies a chunk in a file transmission. +message FileChunkId { + // Temporary identifier containing the file and registration_id. + FileTransmissionId file_transmission_id = 1; + // The number of this chunk. Chunks do not have to be uploaded in the correct + // sequence. This chunk number is used to define the order of the chunks. + int32 chunk_no = 3; +} + +// Temporary identifier of a single file during a transmission. +message FileTransmissionId { + // The registration id which has been issued by the target of the trans + string registration_id = 1; + // A temporary identifier which identifies the file of this chunk. The + // file_id is also used by transaction to associate entities (which are to be + // inserted or updated) with a binary blob. + string file_id = 2; +} + +// Chunk metadata. +message FileChunkMetadata { + // The size of this chunk + int64 chunk_size = 4; +} + +// Request for a file upload which has been registered previously. Chunks may be send in any order. +message FileUploadRequest { + // A single file chunk + FileChunk chunk = 1; +} + +// Response of the server upon a finished FileUpload. +message FileUploadResponse { + // Status of the upload. + TransmissionStatus status = 1; +} + +// Request for a file download which has been registered previously. +message FileDownloadRequest { + // Download a chunk by identifying the chunk explicitely or by letting the + // server decide which chunk is to be send. + oneof request { + // The registration id which has previously been issued by the server. This + // request means: Send any chunk + string registration_id = 1; + // An id of a chunk. The client can guess a chunk id or use one from a + // previous download request's next field. + FileChunkId chunk_id = 2; + } +} + +// Response containing a chunk of a file. +message FileDownloadResponse { + // Status of the download + TransmissionStatus status = 1; + // A single file chunk + FileChunk chunk = 2; + // The next chunk (if any) + FileChunkId next = 3; +} + +// File Transaction Service +service FileTransmissionService { + // Register a file upload. This needs to be done prior to the actual upload + // and prior to the transaction request which uses the uploaded files. + rpc RegisterFileUpload(RegisterFileUploadRequest) returns (RegisterFileUploadResponse); + // The actual file upload. The upload has to be registered prior to this rpc. + rpc FileUpload(FileUploadRequest) returns (FileUploadResponse); + // Register a file download. This needs to be done prior to the actual download. + rpc RegisterFileDownload(RegisterFileDownloadRequest) returns (RegisterFileDownloadResponse); + // The actual download. The download has to be registered prior this rpc. + rpc FileDownload(FileDownloadRequest) returns (FileDownloadResponse); +} +