- Full directory structure with all __init__.py stubs - requirements.txt with all pinned dependencies - app/config/settings.py (BaseSettings, env-based) - app/main.py (CORS, lifespan, /api/v1/health) - Dockerfile (multi-stage, Python 3.12-slim, non-root user) - docker-compose.yml (app + postgres:16 with healthcheck) - .env.example - BACKEND_PLAN.md: mark step 1 done, add one-step-at-a-time rule Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
from contextlib import asynccontextmanager
|
|
|
|
from fastapi import FastAPI
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
|
|
from app.config.settings import settings
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
# Startup: initialise DB connection pool and agent registry
|
|
from app.core.agent_registry import registry # noqa: F401 — triggers module load
|
|
import app.agents # noqa: F401 — triggers @registry.register decorators
|
|
|
|
yield
|
|
|
|
# Shutdown: nothing to clean up for now
|
|
|
|
|
|
def create_app() -> FastAPI:
|
|
app = FastAPI(
|
|
title="Adiuva Cloud API",
|
|
version="0.1.0",
|
|
docs_url="/docs" if settings.ENV == "dev" else None,
|
|
redoc_url=None,
|
|
lifespan=lifespan,
|
|
)
|
|
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=settings.CORS_ORIGINS,
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
# Routers (registered when implemented)
|
|
# from app.api.routes import auth, chat, plans, backup, billing
|
|
# app.include_router(auth.router, prefix="/api/v1")
|
|
# app.include_router(chat.router, prefix="/api/v1")
|
|
# app.include_router(plans.router, prefix="/api/v1")
|
|
# app.include_router(backup.router, prefix="/api/v1")
|
|
# app.include_router(billing.router, prefix="/api/v1")
|
|
|
|
@app.get("/api/v1/health", tags=["health"])
|
|
async def health() -> dict:
|
|
return {"status": "ok", "version": app.version}
|
|
|
|
return app
|
|
|
|
|
|
app = create_app()
|