59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
from contextlib import asynccontextmanager
|
|
from typing import Any, AsyncIterator, Mapping
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv() # load .env before db.py reads DATABASE_URL
|
|
|
|
from fastapi import FastAPI # noqa: E402
|
|
from fastapi.middleware.cors import CORSMiddleware # noqa: E402
|
|
from fastmcp.utilities.lifespan import combine_lifespans # noqa: E402
|
|
from starlette.applications import Starlette # noqa: E402
|
|
|
|
from db import create_db_and_tables # noqa: E402
|
|
from innercontext.api import ( # noqa: E402
|
|
ai_logs,
|
|
health,
|
|
inventory,
|
|
products,
|
|
routines,
|
|
skincare,
|
|
)
|
|
from innercontext.mcp_server import mcp # noqa: E402
|
|
|
|
mcp_app = mcp.http_app(path="/mcp")
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: Starlette) -> AsyncIterator[Mapping[str, Any] | None]:
|
|
create_db_and_tables()
|
|
yield
|
|
|
|
|
|
app = FastAPI(
|
|
title="innercontext API",
|
|
lifespan=combine_lifespans(lifespan, mcp_app.lifespan),
|
|
redirect_slashes=False,
|
|
)
|
|
|
|
app.add_middleware(
|
|
CORSMiddleware, # ty: ignore[invalid-argument-type]
|
|
allow_origins=["*"],
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
app.include_router(products.router, prefix="/products", tags=["products"])
|
|
app.include_router(inventory.router, prefix="/inventory", tags=["inventory"])
|
|
app.include_router(health.router, prefix="/health", tags=["health"])
|
|
app.include_router(routines.router, prefix="/routines", tags=["routines"])
|
|
app.include_router(skincare.router, prefix="/skincare", tags=["skincare"])
|
|
app.include_router(ai_logs.router, prefix="/ai-logs", tags=["ai-logs"])
|
|
|
|
|
|
app.mount("/mcp", mcp_app)
|
|
|
|
|
|
@app.get("/health-check")
|
|
def health_check():
|
|
return {"status": "ok"}
|