"""md2vk — FastAPI приложение.""" from __future__ import annotations import logging from contextlib import asynccontextmanager from fastapi import FastAPI, Request from fastapi.responses import FileResponse, HTMLResponse, JSONResponse from app.database import init_db from app.api.v1 import router as api_v1_router from app.api.audit import AuditMiddleware from pathlib import Path logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s") logger = logging.getLogger("md2vk") @asynccontextmanager async def lifespan(app: FastAPI): """Инициализация при старте.""" logger.info("Initializing database...") await init_db() logger.info("Database ready. Starting md2vk...") yield logger.info("Shutting down...") app = FastAPI( title="md2vk", description="Сервис публикации Markdown на стене VK", version="0.1.0", lifespan=lifespan, ) # Аудит-лог авторизации/запросов API (JSONL, ротация по дням) app.add_middleware(AuditMiddleware) app.include_router(api_v1_router) STATIC_DIR = Path(__file__).resolve().parent.parent / "static" @app.get("/favicon.ico", include_in_schema=False) async def favicon() -> FileResponse: """Favicon (SVG-бренд).""" return FileResponse(STATIC_DIR / "favicon.svg", media_type="image/svg+xml") @app.get("/", response_class=HTMLResponse, include_in_schema=False) async def index() -> HTMLResponse: """Стартовая страница сервиса.""" return HTMLResponse( """
Сервис публикации Markdown на стену ВКонтакте.
API: /api/v1 · Swagger UI · ReDoc