From 154c0a4d36a80081b67a30ec62629bc20c42e0eb Mon Sep 17 00:00:00 2001 From: Mike Liao Date: Tue, 22 Oct 2024 17:20:44 -0700 Subject: [PATCH] add upload document api --- .../webapi/routes/upload_document.py | 21 +++++----- .../webapi/routes/upload_file.py | 42 +++++++++++++++++++ 2 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 app/central_storage/webapi/routes/upload_file.py diff --git a/app/central_storage/webapi/routes/upload_document.py b/app/central_storage/webapi/routes/upload_document.py index fda28d0..bb8b471 100644 --- a/app/central_storage/webapi/routes/upload_document.py +++ b/app/central_storage/webapi/routes/upload_document.py @@ -5,36 +5,37 @@ from starlette.status import HTTP_401_UNAUTHORIZED from fastapi.encoders import jsonable_encoder from fastapi.responses import JSONResponse from app.central_storage.backend.application.document_hub import DocumentHub - +from pydantic import BaseModel router = APIRouter() -token_manager = TokenManager() +class Item(BaseModel): + associated_with: str + name: str + blob: bytes @router.post( "/upload-document", - summary="upload a document with a given associated_with id.", + summary="upload a document with a given associated_with id, document name and document data.", description="upload a document. If success, returning the document id", ) -async def attach_document_for_request( - associated_with: str = Form(...), - file: UploadFile = File(None) +async def upload_document( + item:Item ): document_hub = DocumentHub() # File processing try: - file_data = await file.read() # You can use async chunking for larger files document_id = await document_hub.upload_document( - associated_with, file.filename, file_data + item.associated_with, item.name, item.blob ) if document_id: - result = {"document_id": str(document_id), "file_name": file.filename} + result = {"document_id": str(document_id)} return JSONResponse(content=jsonable_encoder(result)) else: return JSONResponse( - status_code=500, content={"error": "File upload failed"} + status_code=500, content={"error": "Document upload failed"} ) except Exception as e: diff --git a/app/central_storage/webapi/routes/upload_file.py b/app/central_storage/webapi/routes/upload_file.py new file mode 100644 index 0000000..956c472 --- /dev/null +++ b/app/central_storage/webapi/routes/upload_file.py @@ -0,0 +1,42 @@ +from fastapi import APIRouter, UploadFile, File, Form, HTTPException +from fastapi import APIRouter, Depends +from infra.token.token_manager import TokenManager +from starlette.status import HTTP_401_UNAUTHORIZED +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse +from app.central_storage.backend.application.document_hub import DocumentHub + + +router = APIRouter() +token_manager = TokenManager() + + +@router.post( + "/upload-file", + summary="upload a document with a given associated_with id.", + description="upload a document. If success, returning the document id and file name", +) +async def upload_file( + associated_with: str = Form(...), + file: UploadFile = File(None) +): + + document_hub = DocumentHub() + # File processing + try: + file_data = await file.read() # You can use async chunking for larger files + document_id = await document_hub.upload_document( + associated_with, file.filename, file_data + ) + + if document_id: + result = {"document_id": str(document_id), "file_name": file.filename} + return JSONResponse(content=jsonable_encoder(result)) + else: + return JSONResponse( + status_code=500, content={"error": "File upload failed"} + ) + + except Exception as e: + print("this is exception", e) + return JSONResponse(status_code=500, content={"error": "Internal server error"})