diff --git a/app/modules/sag/backend/router.py b/app/modules/sag/backend/router.py index 1ac3997..9471ebb 100644 --- a/app/modules/sag/backend/router.py +++ b/app/modules/sag/backend/router.py @@ -3158,11 +3158,17 @@ def _store_upload_file(upload_file: UploadFile, subdir: str): async def list_sag_files(sag_id: int): """List files attached to a case.""" try: + if not _table_exists("sag_files"): + logger.warning("⚠️ sag_files table missing - returning empty file list for SAG-%s", sag_id) + return [] + + order_expr = "created_at DESC" if table_has_column("sag_files", "created_at") else "id DESC" query = """ SELECT * FROM sag_files WHERE sag_id = %s - ORDER BY created_at DESC + ORDER BY {order_expr} """ + query = query.format(order_expr=order_expr) files = execute_query(query, (sag_id,)) # Add download URL if files: @@ -3176,6 +3182,9 @@ async def list_sag_files(sag_id: int): @router.post("/sag/{sag_id}/files") async def upload_sag_files(sag_id: int, files: List[UploadFile] = File(...)): """Upload files to a case.""" + if not _table_exists("sag_files"): + raise HTTPException(status_code=503, detail="sag_files table is missing. Run database migrations first") + check = execute_query("SELECT id FROM sag_sager WHERE id = %s AND deleted_at IS NULL", (sag_id,)) if not check: raise HTTPException(status_code=404, detail="Case not found") @@ -3211,6 +3220,9 @@ async def download_sag_file(sag_id: int, file_id: int, download: bool = False): Args: download: If True, force download. If False (default), display inline in browser. """ + if not _table_exists("sag_files"): + raise HTTPException(status_code=503, detail="sag_files table is missing. Run database migrations first") + query = "SELECT * FROM sag_files WHERE id = %s AND sag_id = %s" result = execute_query(query, (file_id, sag_id)) @@ -3241,6 +3253,9 @@ async def download_sag_file(sag_id: int, file_id: int, download: bool = False): @router.get("/sag/{sag_id}/files/{file_id}/preview-image") async def preview_sag_pdf_as_image(sag_id: int, file_id: int, page: int = Query(1, ge=1), scale: float = Query(2.8, ge=1.0, le=5.0)): """Render a PDF page as PNG for consistent in-app preview sizing.""" + if not _table_exists("sag_files"): + raise HTTPException(status_code=503, detail="sag_files table is missing. Run database migrations first") + query = "SELECT * FROM sag_files WHERE id = %s AND sag_id = %s" result = execute_query(query, (file_id, sag_id)) @@ -3287,6 +3302,9 @@ async def preview_sag_pdf_as_image(sag_id: int, file_id: int, page: int = Query( @router.delete("/sag/{sag_id}/files/{file_id}") async def delete_sag_file(sag_id: int, file_id: int): """Delete a file.""" + if not _table_exists("sag_files"): + raise HTTPException(status_code=503, detail="sag_files table is missing. Run database migrations first") + query = "DELETE FROM sag_files WHERE id = %s AND sag_id = %s RETURNING stored_name" result = execute_query(query, (file_id, sag_id))