PDF-Insight-PRO / api /upload_routes.py
Jatin Mehra
Refactor and reorganize codebase for improved maintainability and clarity
ba907cd
"""
File upload API routes.
This module handles PDF file upload and processing endpoints.
"""
import os
import shutil
import traceback
import uuid
from fastapi import UploadFile, File, Form, HTTPException
from fastapi.responses import JSONResponse
from configs.config import Config, ErrorMessages, SuccessMessages
from models.models import UploadResponse
from services import session_manager, validate_api_keys
from utils import process_pdf_file, chunk_text, create_upload_file_path
async def upload_pdf_handler(
file: UploadFile = File(...),
model_name: str = Form(Config.DEFAULT_MODEL)
) -> UploadResponse:
"""
Handle PDF file upload and processing.
Args:
file: Uploaded PDF file
model_name: LLM model name to use
Returns:
Upload response with session ID
Raises:
HTTPException: If processing fails
"""
session_id = str(uuid.uuid4())
file_path = None
try:
# Validate API keys
validate_api_keys(model_name, use_search=False)
# Save uploaded file
file_path = create_upload_file_path(session_id, file.filename)
with open(file_path, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
# Process PDF file
documents = process_pdf_file(file_path)
chunks_with_metadata = chunk_text(documents, max_length=Config.DEFAULT_CHUNK_SIZE)
# Create session
session_id = session_manager.create_session(
file_path=file_path,
file_name=file.filename,
chunks_with_metadata=chunks_with_metadata,
model_name=model_name
)
return UploadResponse(
status="success",
session_id=session_id,
message=SuccessMessages.PDF_PROCESSED.format(filename=file.filename)
)
except Exception as e:
# Clean up file on error
if file_path and os.path.exists(file_path):
os.remove(file_path)
error_msg = str(e)
stack_trace = traceback.format_exc()
print(f"Error processing PDF: {error_msg}\nStack trace: {stack_trace}")
raise HTTPException(
status_code=500,
detail=ErrorMessages.PDF_PROCESSING_ERROR.format(error=error_msg)
)