diff --git a/backend/app/models/files.py b/backend/app/models/files.py index 0a22d4474..926fac105 100644 --- a/backend/app/models/files.py +++ b/backend/app/models/files.py @@ -13,6 +13,8 @@ class FileVersion(MongoModel): version_num: int = 1 file_id: PyObjectId creator: UserOut + bytes: int = 0 + content_type: str = "N/A" created: datetime = Field(default_factory=datetime.utcnow) @@ -33,6 +35,8 @@ class FileDB(FileBase): folder_id: Optional[PyObjectId] views: int = 0 downloads: int = 0 + bytes: int = 0 + content_type: str = "N/A" class FileOut(FileDB): diff --git a/backend/app/routers/datasets.py b/backend/app/routers/datasets.py index 93588a04a..36beac957 100644 --- a/backend/app/routers/datasets.py +++ b/backend/app/routers/datasets.py @@ -316,11 +316,15 @@ async def save_file( part_size=settings.MINIO_UPLOAD_CHUNK_SIZE, ) # async write chunk to minio version_id = response.version_id + bytes = len(fs.get_object(settings.MINIO_BUCKET_NAME, str(new_file_id)).data) + content_type = file.content_type if version_id is None: # TODO: This occurs in testing when minio is not running version_id = 999999999 fileDB.version_id = version_id fileDB.version_num = 1 + fileDB.bytes = bytes + fileDB.content_type = content_type print(fileDB) await db["files"].replace_one({"_id": ObjectId(new_file_id)}, fileDB.to_mongo()) @@ -329,6 +333,8 @@ async def save_file( version_id=version_id, file_id=new_file_id, creator=user, + bytes=bytes, + content_type=content_type ) await db["file_versions"].insert_one(new_version.to_mongo()) return fileDB diff --git a/frontend/src/components/files/FileAbout.tsx b/frontend/src/components/files/FileAbout.tsx index 070a294fb..88c0fe0c8 100644 --- a/frontend/src/components/files/FileAbout.tsx +++ b/frontend/src/components/files/FileAbout.tsx @@ -9,7 +9,7 @@ type FileAboutProps = { } export function FileAbout(props: FileAboutProps) { - const {id, created, name, creator, version_id} = props.fileSummary; + const {id, created, name, creator, version_id, bytes, content_type} = props.fileSummary; return ( @@ -19,6 +19,8 @@ export function FileAbout(props: FileAboutProps) { Uploaded as: {name} Uploaded by: {creator.first_name} {creator.last_name} Latest Version: {version_id} + Size: {bytes} bytes + Content Type: {content_type} ); } diff --git a/frontend/src/components/files/FilesTable.tsx b/frontend/src/components/files/FilesTable.tsx index 0315f206b..8a72acbce 100644 --- a/frontend/src/components/files/FilesTable.tsx +++ b/frontend/src/components/files/FilesTable.tsx @@ -48,8 +48,8 @@ export default function FilesTable(props: FilesTableProps) { Name Updated - {/*Size*/} - {/*Type*/} + Size + Type @@ -83,9 +83,8 @@ export default function FilesTable(props: FilesTableProps) { {parseDate(file.created)} by {file.creator.first_name} {file.creator.last_name} - {/*TODO we don't have those in backend yet*/} - {/*{file.size}*/} - {/*{file.contentType}*/} + {file.bytes} bytes + {file.content_type} )) } diff --git a/frontend/src/openapi/v2/models/FileOut.ts b/frontend/src/openapi/v2/models/FileOut.ts index ff4879917..51394d786 100644 --- a/frontend/src/openapi/v2/models/FileOut.ts +++ b/frontend/src/openapi/v2/models/FileOut.ts @@ -15,4 +15,6 @@ export type FileOut = { folder_id?: string; views?: number; downloads?: number; + bytes?: number; + content_type?: string; } diff --git a/frontend/src/openapi/v2/models/FileVersion.ts b/frontend/src/openapi/v2/models/FileVersion.ts index b459ded90..eb2177be8 100644 --- a/frontend/src/openapi/v2/models/FileVersion.ts +++ b/frontend/src/openapi/v2/models/FileVersion.ts @@ -10,5 +10,7 @@ export type FileVersion = { version_num?: number; file_id: string; creator: UserOut; + bytes?: number; + content_type?: string; created?: string; } diff --git a/frontend/src/openapi/v2/services/FilesService.ts b/frontend/src/openapi/v2/services/FilesService.ts index ebed8f4cd..f958674b8 100644 --- a/frontend/src/openapi/v2/services/FilesService.ts +++ b/frontend/src/openapi/v2/services/FilesService.ts @@ -111,4 +111,22 @@ export class FilesService { }); } + /** + * Get File Extract + * @param fileId + * @returns any Successful Response + * @throws ApiError + */ + public static getFileExtractApiV2FilesFileIdExtractPost( + fileId: string, + ): CancelablePromise { + return __request({ + method: 'POST', + path: `/api/v2/files/${fileId}/extract`, + errors: { + 422: `Validation Error`, + }, + }); + } + } \ No newline at end of file diff --git a/frontend/src/openapi/v2/services/MetadataService.ts b/frontend/src/openapi/v2/services/MetadataService.ts index 880970764..a49bea77e 100644 --- a/frontend/src/openapi/v2/services/MetadataService.ts +++ b/frontend/src/openapi/v2/services/MetadataService.ts @@ -61,6 +61,25 @@ export class MetadataService { }); } + /** + * Delete Metadata + * Delete metadata by specific ID. + * @param metadataId + * @returns any Successful Response + * @throws ApiError + */ + public static deleteMetadataApiV2MetadataMetadataIdDelete( + metadataId: string, + ): CancelablePromise { + return __request({ + method: 'DELETE', + path: `/api/v2/metadata/${metadataId}`, + errors: { + 422: `Validation Error`, + }, + }); + } + /** * Update Metadata * Update metadata. Any fields provided in the contents JSON will be added or updated in the metadata. If context or