"""FastAPI application factory with security middleware.""" from __future__ import annotations import logging from contextlib import asynccontextmanager from typing import TYPE_CHECKING from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from hermes.api.middleware import RateLimitMiddleware, SecurityHeadersMiddleware from hermes.config.settings import get_settings from hermes.mcp.server import mcp_server from hermes.tools.register import register_default_tools if TYPE_CHECKING: from collections.abc import AsyncGenerator logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]: """Application lifespan handler.""" logger.info("Starting Hermes Platform...") register_default_tools() await mcp_server.initialize() # Initialize database from hermes.database.connection import DatabaseManager db = DatabaseManager() await db.initialize() await db.create_tables() app.state.db = db # Initialize observability from hermes.observability.tracer import tracer await tracer.initialize() logger.info("Hermes Platform started") yield logger.info("Shutting down Hermes Platform...") await db.close() def create_app() -> FastAPI: """Create FastAPI application.""" settings = get_settings() app = FastAPI( title=settings.app_name, description="VGTC — AI-powered Global Trade Compliance", version="2.0.0", lifespan=lifespan, ) allowed = settings.security.allowed_origins app.add_middleware( CORSMiddleware, allow_origins=allowed, allow_credentials=True, allow_methods=["GET", "POST"], allow_headers=["Authorization", "Content-Type"], ) app.add_middleware(SecurityHeadersMiddleware) app.add_middleware( RateLimitMiddleware, max_requests=settings.security.rate_limit_per_minute, window_seconds=60, ) from hermes.api.routers import agent, analysis, classify, health, mcp, research, security app.include_router(health.router, tags=["health"]) app.include_router(research.router, prefix="/api/v1", tags=["research"]) app.include_router(analysis.router, prefix="/api/v1", tags=["analysis"]) app.include_router(security.router, prefix="/api/v1", tags=["security"]) app.include_router(agent.router, prefix="/api/v1", tags=["agent"]) app.include_router(classify.router, prefix="/api/v1", tags=["classify"]) app.include_router(mcp.router, prefix="/api/v1/mcp", tags=["mcp"]) return app