Add api server2

2
This commit is contained in:
2026-02-08 20:48:59 +01:00
parent 627a730191
commit 5a2fdd65d0
14 changed files with 328 additions and 0 deletions

70
api/main.py Normal file
View File

@@ -0,0 +1,70 @@
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from api.models import PaperResponse, ScanRequest, ScanResponse, StatusResponse
from api.scanner import (
ScannerBusyError,
ScannerManager,
ScannerTimeoutError,
ScannerUnavailableError,
)
@asynccontextmanager
async def lifespan(app: FastAPI):
app.state.scanner = ScannerManager()
yield
app = FastAPI(title="scan-adf", lifespan=lifespan)
@app.exception_handler(ScannerBusyError)
async def busy_handler(request: Request, exc: ScannerBusyError):
return JSONResponse(status_code=409, content={"detail": str(exc)})
@app.exception_handler(ScannerUnavailableError)
async def unavailable_handler(request: Request, exc: ScannerUnavailableError):
return JSONResponse(status_code=503, content={"detail": str(exc)})
@app.exception_handler(ScannerTimeoutError)
async def timeout_handler(request: Request, exc: ScannerTimeoutError):
return JSONResponse(status_code=504, content={"detail": str(exc)})
@app.post("/scan", status_code=201, response_model=ScanResponse)
async def scan(request: Request, body: ScanRequest):
scanner: ScannerManager = request.app.state.scanner
output = await scanner.start_scan(
mode=body.mode.value,
resolution=body.resolution,
language=body.language,
output=body.output,
)
return ScanResponse(
message="Scan started",
output=output,
mode=body.mode.value,
resolution=body.resolution,
)
@app.get("/status", response_model=StatusResponse)
async def status(request: Request):
scanner: ScannerManager = request.app.state.scanner
return StatusResponse(
scanning=scanner.is_scanning,
last_result=scanner.last_result,
current=scanner.current_scan_info,
)
@app.get("/paper", response_model=PaperResponse)
async def paper(request: Request):
scanner: ScannerManager = request.app.state.scanner
result = await scanner.check_paper()
return PaperResponse(**result)