File size: 2,083 Bytes
42d4c60
 
 
 
 
 
 
 
 
 
fb7b1a4
42d4c60
 
 
 
fb7b1a4
 
42d4c60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5c529ab
 
42d4c60
 
 
 
 
 
 
 
 
 
 
 
 
 
fb7b1a4
 
42d4c60
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
"""
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)