Faraz618's picture
Create api/routes.py
dd5cf2a verified
Raw
History Blame Contribute Delete
2.92 kB
import json
import logging
from fastapi import FastAPI, HTTPException, Query
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from typing import Optional, List
from core.database import (
get_all_documents,
get_document_by_id,
search_documents,
get_stats,
init_db
)
logger = logging.getLogger(__name__)
# FastAPI app instance
api_app = FastAPI(
title="Arabic Document Intelligence API",
description="Query and retrieve processed Arabic documents",
version="1.0.0"
)
api_app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["GET", "POST"],
allow_headers=["*"]
)
class SearchRequest(BaseModel):
query: str
language: Optional[str] = None
@api_app.on_event("startup")
async def startup():
init_db()
logger.info("API started, DB initialized")
@api_app.get("/")
async def root():
return {
"service": "Arabic Document Intelligence API",
"version": "1.0.0",
"endpoints": ["/docs", "/stats", "/documents", "/documents/{id}", "/search"]
}
@api_app.get("/stats")
async def stats():
"""Get database statistics."""
data = get_stats()
if not data:
raise HTTPException(status_code=500, detail="Could not retrieve stats")
return data
@api_app.get("/documents")
async def list_documents(
limit: int = Query(default=20, ge=1, le=100),
offset: int = Query(default=0, ge=0)
):
"""List all processed documents."""
docs = get_all_documents(limit=limit, offset=offset)
return {
"total_returned": len(docs),
"limit": limit,
"offset": offset,
"documents": docs
}
@api_app.get("/documents/{document_id}")
async def get_document(document_id: str):
"""Get a specific document by ID."""
doc = get_document_by_id(document_id)
if not doc:
raise HTTPException(status_code=404, detail=f"Document {document_id} not found")
return doc
@api_app.post("/search")
async def search(request: SearchRequest):
"""Search documents by text content."""
if not request.query or len(request.query) < 2:
raise HTTPException(status_code=400, detail="Query must be at least 2 characters")
results = search_documents(request.query, request.language)
return {
"query": request.query,
"language_filter": request.language,
"total_results": len(results),
"results": results
}
@api_app.get("/documents/{document_id}/json")
async def get_document_json(document_id: str):
"""Get the full structured JSON of a document."""
doc = get_document_by_id(document_id)
if not doc:
raise HTTPException(status_code=404, detail=f"Document {document_id} not found")
structured = doc.get("structured_data")
if not structured:
raise HTTPException(status_code=404, detail="Structured JSON not available")
return structured