import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.auth.routes import router as auth_router from app.rag.routes import router as rag_router from app.logging_config import setup_logging from app.rabbitmq.connection import rabbitmq from app.rabbitmq.consumers import start_consumers setup_logging() logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): # ── Startup ── logger.info("Connecting to RabbitMQ...") await rabbitmq.connect() await start_consumers() yield # ── Shutdown ── logger.info("Disconnecting from RabbitMQ...") await rabbitmq.disconnect() app = FastAPI( title="EchoLoft AI API", description="SaaS RAG Chat with Groq + RabbitMQ event streaming", version="1.2.0", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:3000", "https://echoloftai.vercel.app", ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(auth_router) app.include_router(rag_router, prefix="/rag") @app.get("/") async def root(): return { "message": "Welcome to EchoLoft AI API", "version": "1.2.0", "rabbitmq": "connected" if rabbitmq.is_connected else "disconnected", } @app.get("/health") async def health(): return { "status": "ok", "rabbitmq": "connected" if rabbitmq.is_connected else "disconnected", }