""" Aplicación principal FastAPI """ from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager import logging from app.config import settings from app.prisma_client import connect_db, disconnect_db from app.api.routes import api_router logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): """Lifecycle events""" # Startup logger.info("Iniciando aplicación...") await connect_db() yield # Shutdown logger.info("Cerrando aplicación...") await disconnect_db() app = FastAPI( title=settings.PROJECT_NAME, version=settings.VERSION, lifespan=lifespan ) # CORS - Permitir todas las origenes en desarrollo # En producción, especificar los dominios permitidos app.add_middleware( CORSMiddleware, allow_origins=["*"], # En producción cambiar a dominios específicos allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Static files (solo para media, el frontend se sirve por separado) app.mount("/media", StaticFiles(directory=str(settings.MEDIA_DIR)), name="media") # API Routes app.include_router(api_router, prefix="/api") @app.get("/") async def root(): """API Root - Redirige a documentación""" return { "message": "Sistema de Gestión de Pedidos API", "version": settings.VERSION, "docs": "/docs", "frontend": "El frontend debe ejecutarse por separado en http://localhost:3000 o similar" } @app.get("/health") async def health(): """Health check""" return {"status": "ok"}