import sys from fastapi import FastAPI, UploadFile, File, Depends, HTTPException, status from fastapi.middleware.cors import CORSMiddleware from sqlalchemy.orm import Session from datetime import datetime # Initialize FastAPI App app = FastAPI( title="DocVerse Medical Intelligence API", description="FastAPI Backend for Document Scanning, NLP, and Risk Analysis", version="1.0.0", ) # CORS Middleware Configurations app.add_middleware( CORSMiddleware, allow_origins=["*"], # In production, restrict this allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) from app.db.database import engine, get_db from app.models.database_models import Base, User, Report, LabResult, RiskFlag # Create all tables in DB if they don't exist Base.metadata.create_all(bind=engine) # Route Definitions @app.get("/") def health_check(): return {"status": "ok", "timestamp": datetime.utcnow()} @app.post("/api/v1/auth/register") def register_user(user_data: dict, db: Session = Depends(get_db)): """ Register a new user and generate a JWT token """ # Real logic: Hash password with passlib new_user = User(email=user_data.get("email"), password_hash="hashed_pw_here") db.add(new_user) db.commit() db.refresh(new_user) return {"message": "User registered successfully", "user_id": str(new_user.id)} @app.post("/api/v1/auth/login") def login(credentials: dict, db: Session = Depends(get_db)): """ Login user and return JWT """ return {"access_token": "mock_jwt_token", "token_type": "bearer"} @app.post("/api/v1/scan/upload") async def upload_document( file: UploadFile = File(...), current_user: str = "mock_user", # JWT Dependency in reality db: Session = Depends(get_db) ): """ Upload document (PDF/Image) for OCR Processing """ if not file.filename.endswith(('.pdf', '.png', '.jpg', '.jpeg')): raise HTTPException(status_code=400, detail="Invalid file format.") # 1. Encrypt and save file to secure storage (S3) # 2. Add Celery Task to process OCR and NLP task_id = "mock_task_id_999" return {"message": "File uploaded and processing started.", "task_id": task_id} @app.get("/api/v1/scan/status/{task_id}") def get_scan_status(task_id: str): """ Check the processing status of the OCR/NLP pipeline """ return {"task_id": task_id, "status": "completed", "progress": 100} @app.get("/api/v1/reports") def get_reports(current_user: str = "mock_user", db: Session = Depends(get_db)): """ Get paginated list of encrypted user reports """ # Real logic: Filter by current authenticated user reports = db.query(Report).all() return {"reports": [{"id": str(r.id), "file_name": r.file_name, "status": r.status} for r in reports]} @app.get("/api/v1/health/labs") def get_lab_trends(current_user: str = "mock_user", db: Session = Depends(get_db)): """ Retrieve timeline data for lab tests to chart in Flutter """ labs = db.query(LabResult).all() return {"lab_trends": [{"test": l.test_name, "value": l.test_value, "flag": l.flag} for l in labs]} @app.post("/api/v1/reminders") def create_reminder(reminder: dict, current_user: str = "mock_user", db: Session = Depends(get_db)): """ Add a medication reminder """ return {"message": "Reminder created successfully", "reminder_id": "999"} if __name__ == "__main__": import uvicorn uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)