"""Точка входа FastAPI: health + OAuth-флоу gnexus-gauth + защищённый /api."""
from typing import Annotated, cast
from fastapi import Depends, FastAPI, HTTPException, Request
from fastapi.middleware.cors import CORSMiddleware
from starlette.middleware.sessions import SessionMiddleware
from app.auth.routes import router as auth_router
from app.config import get_settings
app = FastAPI(title="gntodo API", version="0.1.0")
# CORS: в разработке — vite dev server; в проде фронт отдаётся тем же origin через nginx.
settings = get_settings()
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:5173"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Сессия — подписанная cookie (HttpOnly); секрет из окружения.
app.add_middleware(SessionMiddleware, secret_key=settings.session_secret)
app.include_router(auth_router)
def require_user(request: Request) -> dict[str, str]:
"""Зависимость-защита API: пользователь должен быть залогинен."""
user = request.session.get("user")
if not user:
raise HTTPException(status_code=401, detail="Not authenticated")
return cast(dict[str, str], user)
@app.get("/api/health")
async def health() -> dict[str, str]:
return {"status": "ok"}
@app.get("/api/me")
async def api_me(
user: Annotated[dict[str, str], Depends(require_user)],
) -> dict[str, dict[str, str]]:
return {"user": user}