|
|
|
|
|
""" |
|
|
Configuration API Router |
|
|
======================== |
|
|
API endpoints for configuration management and hot reload |
|
|
""" |
|
|
|
|
|
from fastapi import APIRouter, HTTPException, Query |
|
|
from fastapi.responses import JSONResponse |
|
|
from typing import Optional, Dict, Any |
|
|
import logging |
|
|
|
|
|
from backend.services.config_manager import get_config_manager |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
router = APIRouter( |
|
|
prefix="/api/config", |
|
|
tags=["Configuration"] |
|
|
) |
|
|
|
|
|
|
|
|
config_manager = get_config_manager() |
|
|
|
|
|
|
|
|
@router.post("/reload") |
|
|
async def reload_config(config_name: Optional[str] = Query(None, description="Specific config to reload (reloads all if omitted)")) -> JSONResponse: |
|
|
""" |
|
|
Manually reload configuration files. |
|
|
|
|
|
Reloads a specific configuration file or all configuration files. |
|
|
|
|
|
Args: |
|
|
config_name: Optional specific config name to reload |
|
|
|
|
|
Returns: |
|
|
JSON response with reload status |
|
|
""" |
|
|
try: |
|
|
result = config_manager.manual_reload(config_name) |
|
|
|
|
|
if result["success"]: |
|
|
return JSONResponse( |
|
|
status_code=200, |
|
|
content={ |
|
|
"success": True, |
|
|
"message": result["message"], |
|
|
"data": result |
|
|
} |
|
|
) |
|
|
else: |
|
|
raise HTTPException(status_code=404, detail=result["message"]) |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"Error reloading config: {e}", exc_info=True) |
|
|
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") |
|
|
|
|
|
|
|
|
@router.get("/status") |
|
|
async def get_config_status() -> JSONResponse: |
|
|
""" |
|
|
Get configuration status. |
|
|
|
|
|
Returns the status of all loaded configurations. |
|
|
|
|
|
Returns: |
|
|
JSON response with config status |
|
|
""" |
|
|
try: |
|
|
all_configs = config_manager.get_all_configs() |
|
|
|
|
|
status = { |
|
|
"loaded_configs": list(all_configs.keys()), |
|
|
"config_count": len(all_configs), |
|
|
"configs": {} |
|
|
} |
|
|
|
|
|
for config_name, config_data in all_configs.items(): |
|
|
status["configs"][config_name] = { |
|
|
"version": config_data.get("version", "unknown"), |
|
|
"last_updated": config_data.get("last_updated", "unknown"), |
|
|
"keys": list(config_data.keys()) |
|
|
} |
|
|
|
|
|
return JSONResponse( |
|
|
status_code=200, |
|
|
content={ |
|
|
"success": True, |
|
|
"data": status |
|
|
} |
|
|
) |
|
|
|
|
|
except Exception as e: |
|
|
logger.error(f"Error getting config status: {e}", exc_info=True) |
|
|
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") |
|
|
|
|
|
|
|
|
@router.get("/{config_name}") |
|
|
async def get_config(config_name: str) -> JSONResponse: |
|
|
""" |
|
|
Get a specific configuration. |
|
|
|
|
|
Retrieves the current configuration for a specific config name. |
|
|
|
|
|
Args: |
|
|
config_name: Name of the config to retrieve |
|
|
|
|
|
Returns: |
|
|
JSON response with configuration data |
|
|
""" |
|
|
try: |
|
|
config = config_manager.get_config(config_name) |
|
|
|
|
|
if config is None: |
|
|
raise HTTPException(status_code=404, detail=f"Config '{config_name}' not found") |
|
|
|
|
|
return JSONResponse( |
|
|
status_code=200, |
|
|
content={ |
|
|
"success": True, |
|
|
"config_name": config_name, |
|
|
"data": config |
|
|
} |
|
|
) |
|
|
|
|
|
except HTTPException: |
|
|
raise |
|
|
except Exception as e: |
|
|
logger.error(f"Error getting config: {e}", exc_info=True) |
|
|
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") |
|
|
|
|
|
|