from pydantic import BaseModel, Field, constr from typing import List, Optional from enum import Enum from models.documents_common import DocumentVersion, LinkData # This file contains models used in responses during upload and download of documents. # ---- UPLOAD MODELS ---- class DocumentUploadSessionInitialization(BaseModel): upload_ui_url: constr(min_length=1) = Field( description='A CDE UI URL for the client to open in a local browser. The user would enter document metadata ' 'directly in the CDE' ) expires_in: int = Field( description='`upload_ui_url` expiry in seconds' ) max_size_in_bytes: int = Field( description='The maximum file size supported by the CDE. Attempts to upload a larger file will fail' ) class HttpMethod(Enum): POST = 'POST' PUT = 'PUT' class HeaderValue(BaseModel): name: constr(min_length=1) value: constr(min_length=1) class Headers(BaseModel): values: List[HeaderValue] class MultipartFormData(BaseModel): prefix: str = Field( description='This is a server provided value. Its value must be prefixed to the binary content body when ' 'uploading this part' ) suffix: str = Field( description='This is a server provided value. Its value must be suffixed to the binary content body when ' 'uploading this part. Typically, this is the end boundary for a multipart/form-data request' ) class UploadFilePartInstruction(BaseModel): url: constr(min_length=1) http_method: HttpMethod additional_headers: Optional[Headers] = None include_authorization: Optional[bool] = Field( description='Whether or not to include the authorization request header in the file upload request. ' 'Including the authorization header with some cloud storage providers might fail the request' ) multipart_form_data: Optional[MultipartFormData] = None content_range_start: int = Field( description='The inclusive, zero index based start for this part' ) content_range_end: int = Field( description='The inclusive, zero index based end for this part' ) class DocumentToUpload(BaseModel): session_file_id: constr(min_length=1) = Field( description='A client-provided identifier that allows matching the specification with the correct file on the ' "user's machine" ) upload_file_parts: List[UploadFilePartInstruction] = Field( description='An array of request specifications detailing how to split the file to parts and upload each part ' 'to the CDE' # min_length=1, ) upload_completion: LinkData upload_cancellation: LinkData class DocumentsToUpload(BaseModel): server_context: Optional[str] = Field( description="A CDE controlled identifier recording the user's context on the CDE. For example which project " 'and folder the user was on. If the client provides the `server_context` in subsequent calls then ' 'the CDE will attemp to load the UI at the same place.' ) documents_to_upload: Optional[List[DocumentToUpload]] # ---- DOWNLOAD MODELS ---- class DocumentDiscoverySessionInitialization(BaseModel): select_documents_url: constr(min_length=1) = Field( description='A CDE UI URL for the client to open in a local browser. The user would search and select ' 'documents directly in the CDE' ) expires_in: int = Field( description='`select_documents_url` expiry in seconds' ) class DocumentsMarkedAsSelected(BaseModel): documents: Optional[List[str]] class SelectedDocuments(BaseModel): server_context: Optional[str] = Field( description="A CDE controlled identifier recording the user's context on the CDE. For example which project " 'and folder the user was on. If the client provides the `server_context` in subsequent calls then ' 'the CDE will attemp to load the UI at the same place.' ) documents: List[DocumentVersion] = Field( description='An array containing all the documents selected by the user' ) class DocumentMetadata(BaseModel): session_file_id: constr(min_length=1) = Field( description='This is a client provided id to differentiate between multiple files that are being uploaded in ' 'the same session' ) document_id: Optional[constr(min_length=1)] = Field( description='When present, indicates that this upload is a new version of an existing document' ) version_number: constr(min_length=1) = Field( description='A human readable version number. This is not expected to be in any specific format across CDEs ' 'and may hold any value' ) title: constr(min_length=1) = Field( description='A human readable code or identifier' ) project: Optional[str] class DocumentVersions(BaseModel): documents: List[DocumentVersion]