from fastapi import FastAPI, Depends
from contextlib import asynccontextmanager
from app.config import settings
from app.database import create_db_and_tables
from app.api import users_router, posts_router
from app.services import get_rabbitmq_client, RabbitMQClient
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan events."""
# Startup
print("Starting up...")
create_db_and_tables()
# Initialize RabbitMQ client
rabbitmq = await get_rabbitmq_client()
await rabbitmq.declare_queue("default")
await rabbitmq.declare_queue("notifications")
await rabbitmq.declare_exchange("events", "topic")
await rabbitmq.bind_queue("notifications", "events", "user.*")
print("Application started successfully")
yield
# Shutdown
print("Shutting down...")
await rabbitmq.disconnect()
print("Application shut down successfully")
app = FastAPI(
title="Test Project API",
description="A test FastAPI application for MCP Python REPL server",
version="1.0.0",
debug=settings.debug,
lifespan=lifespan
)
# Include routers
app.include_router(users_router, prefix="/api/v1")
app.include_router(posts_router, prefix="/api/v1")
@app.get("/")
async def root():
"""Root endpoint."""
return {
"message": "Welcome to Test Project API",
"version": "1.0.0",
"debug": settings.debug,
"database_url": settings.database_url.replace(settings.secret_key, "***") if settings.secret_key in settings.database_url else settings.database_url
}
@app.get("/health")
async def health_check(rabbitmq: RabbitMQClient = Depends(get_rabbitmq_client)):
"""Health check endpoint."""
return {
"status": "healthy",
"database": "connected",
"rabbitmq": "connected" if rabbitmq.is_connected() else "disconnected",
"settings": {
"debug": settings.debug,
"log_level": settings.log_level,
"api_host": settings.api_host,
"api_port": settings.api_port
}
}
@app.get("/config")
async def get_config():
"""Get application configuration (for testing)."""
return {
"database_url": settings.database_url,
"debug": settings.debug,
"log_level": settings.log_level,
"api_host": settings.api_host,
"api_port": settings.api_port,
"rabbitmq_url": settings.rabbitmq_url,
# Don't expose secret key
"secret_key_set": bool(settings.secret_key)
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(
app,
host=settings.api_host,
port=settings.api_port,
log_level=settings.log_level
)