From a24571cc9e801aa8f5e50f985305c7b1741c61a6 Mon Sep 17 00:00:00 2001 From: akumadoferudi Date: Fri, 4 Jul 2025 14:55:11 +0700 Subject: [PATCH] Ferdi: Update logic --- src/aeros_project/router.py | 2 +- src/aeros_project/service.py | 94 ++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 31 deletions(-) diff --git a/src/aeros_project/router.py b/src/aeros_project/router.py index 78330b4..8eaee27 100644 --- a/src/aeros_project/router.py +++ b/src/aeros_project/router.py @@ -16,7 +16,7 @@ router = APIRouter() @router.get("", response_model=StandardResponse[None]) async def import_aro(db_session: DbSession, aeros_project_in: AerosProjectInput, project_name: str = "trialapi"): - await import_aro_project(db_session=db_session) + await import_aro_project(db_session=db_session, aeros_project_in=aeros_project_in) return {"data": None, "status": "success", "message": "Success"} diff --git a/src/aeros_project/service.py b/src/aeros_project/service.py index a829ba4..9eb6a84 100644 --- a/src/aeros_project/service.py +++ b/src/aeros_project/service.py @@ -21,43 +21,77 @@ MAX_FILE_SIZE = 5 * 1024 * 1024 # 5MB client = httpx.AsyncClient(timeout=300.0) -async def import_aro_project(*, db_session: DbSession): - # file = aeros_project_in.aro_file - - # file_ext = os.path.splitext(file.filename)[1].lower() +async def import_aro_project(*, db_session: DbSession, aeros_project_in: AerosProjectInput): + windows_aeros_base_url = os.getenv("WINDOWS_AEROS_BASE_URL", "http://localhost:8800") + file = aeros_project_in.aro_file + + # Get filename + filename_without_ext = os.path.splitext(file.filename)[0] + + # Get file extension + file_ext = os.path.splitext(file.filename)[1].lower() + + # Validate file extension + if file_ext not in ALLOWED_EXTENSIONS: + raise HTTPException( + status_code=400, + detail=f"File type not allowed. Allowed: {ALLOWED_EXTENSIONS}" + ) - # if file_ext not in ALLOWED_EXTENSIONS: - # raise HTTPException( - # status_code=400, - # detail=f"File type not allowed. Allowed: {ALLOWED_EXTENSIONS}" - # ) + # Read and check file size + content = await file.read() + if len(content) > MAX_FILE_SIZE: + raise HTTPException( + status_code=400, + detail="File too large. Max size: 5MB" + ) - # # Read and check file size - # content = await file.read() - # if len(content) > MAX_FILE_SIZE: - # raise HTTPException( - # status_code=400, - # detail="File too large. Max size: 5MB" - # ) - project_name = "trialapi" + # Project name hardcode + # project_name = "trialapi" + + # Project name + project_name = filename_without_ext + ## save File to windows app # Output is string of file path, examole # # Example response "C/dsad/dsad.aro" - # try: - # response = await client.post( - # f"{windows_BASE_URL}/upload", - # json=f"/", - # headers={"Content-Type": "application/json"}, - # ) - # response.raise_for_status() - # except Exception as e: - # raise HTTPException( - # status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) - # ) - + try: + # Reset file position since we already read it for size check + await file.seek(0) + + # Prepare file for upload + files = { + "file": (file.filename, await file.read(), file.content_type or "application/octet-stream") + } + + response = await client.post( + f"{windows_aeros_base_url}/api/aeros/upload-file", + files=files + ) + response.raise_for_status() + + # Get the file path from the response + upload_result = response.json() + aro_path = upload_result.get("full_path") + + if not aro_path: + raise HTTPException( + status_code=500, + detail="Failed to get file path from upload response" + ) + + except httpx.HTTPStatusError as e: + raise HTTPException( + status_code=e.response.status_code, + detail=f"Upload failed: {e.response.text}" + ) + except Exception as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) + ) - aro_path = r"C:/Users/user/Documents/Aeros/sample_project.aro" + # aro_path = r"C:/Users/user/Documents/Aeros/sample_project.aro" aeros_project = AerosProject(project_name=project_name, aro_file_path=aro_path) db_session.add(aeros_project)