from __future__ import annotations from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI, status from fastapi.openapi.utils import get_openapi from fastapi.responses import FileResponse from fastapi.security import HTTPBearer from fastapi.staticfiles import StaticFiles from app.api.router import api_router from app.core.config import get_settings from app.core.exceptions import register_exception_handlers from app.core.logging import setup_logging from app.db.init_db import initialize_database settings = get_settings() setup_logging(settings.log_level) STATIC_DIR = Path(__file__).resolve().parent / "static" bearer_scheme = HTTPBearer() @asynccontextmanager async def lifespan(_: FastAPI): initialize_database() yield app = FastAPI( title=settings.app_name, version="1.0.0", lifespan=lifespan, swagger_ui_parameters={}, ) app.openapi_tags = [ {"name": "auth", "description": "Регистрация и вход в систему"}, {"name": "catalog", "description": "Каталог товаров"}, {"name": "orders", "description": "Управление заказами"}, {"name": "payments", "description": "Оплата заказов"}, ] security_schemes = { "BearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT", "description": "Введите JWT токен, получен через POST /api/v1/auth/login", }, } app.openapi_schema = None # Force regeneration register_exception_handlers(app) app.include_router(api_router, prefix=settings.api_v1_prefix) app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") @app.get("/health", status_code=status.HTTP_200_OK, summary="Health check") def health_check() -> dict[str, str]: return {"status": "ok"} @app.get("/", include_in_schema=False) def frontend_index() -> FileResponse: return FileResponse(STATIC_DIR / "index.html") def custom_openapi(): if app.openapi_schema: return app.openapi_schema openapi_schema = get_openapi( title=app.title, version=app.version, routes=app.routes, ) openapi_schema["components"]["securitySchemes"] = security_schemes app.openapi_schema = openapi_schema return app.openapi_schema app.openapi = custom_openapi # type: ignore[method-assign]