import json from fastapi import APIRouter, Depends, HTTPException, status, UploadFile, File from sqlalchemy.orm import Session from typing import List from database import get_db from models.template_models import TemplateDocument, DocumentLayout from schemas.template_schemas import DocumentSchema, DocumentLayoutSchema, TemplateRecognitionResult from engine.ocr.document_processor import DocumentProcessor from engine.recognition.template_engine import TemplateRecognitionEngine router = APIRouter(prefix="/api/documents", tags=["Documents"]) @router.post("/upload", response_model=DocumentSchema, status_code=status.HTTP_201_CREATED) async def upload_document(file: UploadFile = File(...), db: Session = Depends(get_db)): # 1. Create document record content = await file.read() file_hash = hash(content) # Simple hash for demo db_doc = TemplateDocument( document_name=file.filename, document_type=file.content_type, file_name=file.filename, file_hash=str(file_hash), status="processing" ) db.add(db_doc) db.commit() db.refresh(db_doc) # 2. Process File (OCR & Layout) processor = DocumentProcessor(db) processor.process_file(db_doc.pk_document_id, file.filename, content) db.refresh(db_doc) return db_doc @router.get("/{document_id}", response_model=DocumentSchema) def get_document(document_id: int, db: Session = Depends(get_db)): doc = db.query(TemplateDocument).filter(TemplateDocument.pk_document_id == document_id).first() if not doc: raise HTTPException(status_code=404, detail="Document not found") return doc @router.get("/{document_id}/layout", response_model=List[DocumentLayoutSchema]) def get_document_layout(document_id: int, db: Session = Depends(get_db)): layouts = db.query(DocumentLayout).filter(DocumentLayout.fk_document_id == document_id).order_by(DocumentLayout.sequence_no).all() return layouts @router.post("/{document_id}/recognize", response_model=TemplateRecognitionResult) def recognize_template(document_id: int, db: Session = Depends(get_db)): engine = TemplateRecognitionEngine(db) return engine.recognize_template(document_id)