""" FastAPI application entry point for the PDF Accessibility Pipeline web interface. """ from contextlib import asynccontextmanager import os from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from routes import upload, pipeline, elements, visualizations, download, stages, auth, sessions @asynccontextmanager async def lifespan(app: FastAPI): import database database.init_db() from config import PIPELINE_DIR, JAR_PATH, YOLO_MODEL_PATH checks = [ (PIPELINE_DIR.is_dir(), f"PIPELINE_DIR : {PIPELINE_DIR}"), (JAR_PATH.exists(), f"pdftagger.jar : {JAR_PATH}"), (YOLO_MODEL_PATH.exists(), f"YOLO model : {YOLO_MODEL_PATH}"), ] for ok, label in checks: print(f"[startup] {'OK ' if ok else 'MISSING'} {label}", flush=True) yield app = FastAPI(title="PDF Accessibility Pipeline API", version="0.1.0", lifespan=lifespan) # CORS — allow the Vite dev server, local React app, and any configured public origins _extra_origins = [ o.strip() for o in os.environ.get("CORS_ORIGINS", "").split(",") if o.strip() ] app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:5173", "http://localhost:3000", "https://itagpdf.com", "https://www.itagpdf.com", *_extra_origins, ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Routers app.include_router(upload.router, prefix="/api") app.include_router(pipeline.router, prefix="/api") app.include_router(elements.router, prefix="/api") app.include_router(visualizations.router, prefix="/api") app.include_router(download.router, prefix="/api") app.include_router(stages.router, prefix="/api") app.include_router(auth.router, prefix="/api") app.include_router(sessions.router, prefix="/api") @app.get("/api/health") async def health(): return {"status": "ok"} if __name__ == "__main__": import uvicorn from config import BACKEND_PORT uvicorn.run("main:app", host="0.0.0.0", port=BACKEND_PORT, reload=True)