buildersai / app /routes /documents.py
Kushal
Initial deployment: FastAPI backend with Docker
f3997d4
Raw
History Blame Contribute Delete
3.84 kB
from fastapi import APIRouter, Depends, HTTPException, status, UploadFile, File
from sqlalchemy.orm import Session
from typing import List
from app.database.connection import get_db
from app.database.models import User
from app.schemas.document import DocumentResponse, DocumentListResponse
from app.services.document_service import DocumentService
from app.middleware.auth import get_current_user
router = APIRouter(prefix="/api/documents", tags=["documents"])
@router.post("/upload", response_model=DocumentResponse, status_code=status.HTTP_201_CREATED)
async def upload_document(
file: UploadFile = File(...),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
Upload a document for processing.
Args:
file: Uploaded file
db: Database session
current_user: Current authenticated user
Returns:
Created document metadata
Raises:
HTTPException: If file validation fails
"""
try:
# Upload document
document = DocumentService.upload_document(
db=db,
file=file.file,
user_id=current_user.id,
filename=file.filename
)
# Extract and process text content
from app.utils.document_extractor import document_extractor
try:
# Extract text from the uploaded file
content = document_extractor.extract_text(
file_path=document.file_path,
file_type=document.file_type
)
# Process with RAG service
num_chunks = DocumentService.process_document_content(
db,
document.id,
content
)
print(f"Document {document.filename} processed: {num_chunks} chunks created")
except Exception as e:
print(f"Error processing document content: {e}")
# Document is uploaded but not processed for RAG
# You might want to mark this in the database
return DocumentResponse.from_orm(document)
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e)
)
except Exception as e:
print(f"Error uploading document: {e}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Error uploading document"
)
@router.get("", response_model=DocumentListResponse)
async def get_user_documents(
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
Get all documents for the current user.
Args:
db: Database session
current_user: Current authenticated user
Returns:
List of user documents
"""
documents = DocumentService.get_user_documents(db, current_user.id)
return DocumentListResponse(
documents=[DocumentResponse.from_orm(doc) for doc in documents],
total=len(documents)
)
@router.delete("/{document_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_document(
document_id: str,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
Delete a document and its vector embeddings.
Args:
document_id: Document ID
db: Database session
current_user: Current authenticated user
Raises:
HTTPException: If document not found
"""
success = DocumentService.delete_document(db, document_id)
if not success:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Document not found"
)