"""FastAPI application entrypoint. Thin by design: wire settings, routers, and error handling, and expose the OpenAPI contract. All domain logic lives in the service layer; the privacy engine is the single enforcement point for reads. """ from fastapi import FastAPI, Request from fastapi.responses import JSONResponse from app.api.health import router as health_router from app.api.v1 import api_router from app.core.config import get_settings from app.services.exceptions import Conflict, Forbidden, NotFound def _register_error_handlers(app: FastAPI) -> None: @app.exception_handler(NotFound) async def _not_found(request: Request, exc: NotFound) -> JSONResponse: return JSONResponse(status_code=404, content={"detail": str(exc) or "not found"}) @app.exception_handler(Forbidden) async def _forbidden(request: Request, exc: Forbidden) -> JSONResponse: return JSONResponse(status_code=403, content={"detail": str(exc) or "forbidden"}) @app.exception_handler(Conflict) async def _conflict(request: Request, exc: Conflict) -> JSONResponse: return JSONResponse(status_code=409, content={"detail": str(exc) or "conflict"}) def create_app() -> FastAPI: settings = get_settings() app = FastAPI( title=settings.app_name, version=settings.version, description="Provenance API — family and land provenance.", ) app.include_router(health_router) app.include_router(api_router) _register_error_handlers(app) return app app = create_app()