Newer
Older
gnexus-tasks / backend / app / main.py
"""Точка входа 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}