import logging from fastapi import FastAPI from core.config import settings from api.api_v1.api import api_router from api.api_v2.api import api_router as api_v2_router from fastapi.middleware.cors import CORSMiddleware # Configuración inicial del logging (debe estar al inicio del archivo) # logging.config.dictConfig({ # "version": 1, # "disable_existing_loggers": False, # "formatters": { # "default": { # "()": "uvicorn.logging.DefaultFormatter", # "fmt": "%(levelprefix)s %(asctime)s | %(name)s | %(message)s", # "datefmt": "%Y-%m-%d %H:%M:%S", # "use_colors": True, # }, # "access": { # "()": "uvicorn.logging.AccessFormatter", # "fmt": '%(levelprefix)s %(asctime)s | %(client_addr)s | "%(request_line)s" %(status_code)s', # "datefmt": "%Y-%m-%d %H:%M:%S", # }, # }, # "handlers": { # "default": { # "formatter": "default", # "class": "logging.StreamHandler", # "stream": "ext://sys.stdout", # }, # "access": { # "formatter": "access", # "class": "logging.StreamHandler", # "stream": "ext://sys.stdout", # }, # }, # "loggers": { # "": {"handlers": ["default"], "level": "DEBUG"}, # "uvicorn.error": {"level": "DEBUG"}, # "uvicorn.access": {"handlers": ["access"], "level": "DEBUG", "propagate": False}, # }, # }) def create_application() -> FastAPI: """Función factory para crear la aplicación FastAPI""" application = FastAPI( title=settings.APP_NAME, description="EFC Microservice - Un microservicio profesional por AduanaSoft con soporte para tareas asíncronas", version=settings.APP_VERSION, debug=settings.DEBUG, swagger_ui_parameters={"theme": "light"} ) # Configuración adicional para loggers específicos app_logger = logging.getLogger("app") app_logger.setLevel(logging.DEBUG if settings.DEBUG else logging.INFO) # Incluir el router principal de la API application.include_router(api_router, prefix="/api/v1") application.include_router(api_v2_router, prefix="/api/v2") return application app = create_application() app.add_middleware( CORSMiddleware, allow_origins=["*"], # O especifica ["http://localhost:5173"] allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Event handlers para Celery @app.on_event("startup") async def startup_event(): """Inicialización al arrancar la aplicación""" logger = logging.getLogger(__name__) logger.info("Iniciando EFC Microservice con soporte asíncrono") logger.info("Celery configurado para tareas en segundo plano") @app.on_event("shutdown") async def shutdown_event(): """Limpieza al cerrar la aplicación""" logger = logging.getLogger(__name__) logger.info("Cerrando EFC Microservice") if __name__ == "__main__": import uvicorn uvicorn.run( app, host=settings.HOST, port=settings.PORT, log_config=None, # Usamos nuestra configuración log_level="debug" if settings.DEBUG else "info", reload=settings.DEBUG )