Fundamental_Analysis/backend/app/routers/config.py

124 lines
4.1 KiB
Python

"""
配置相关API路由
"""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
import logging
from ..core.dependencies import get_database_session
from ..schemas.config import ConfigResponse, ConfigUpdateRequest, ConfigTestRequest, ConfigTestResponse
from ..services.config_manager import ConfigManager
from ..core.exceptions import ConfigurationError, DatabaseError
logger = logging.getLogger(__name__)
router = APIRouter()
@router.get("/", response_model=ConfigResponse)
async def get_config(
db: AsyncSession = Depends(get_database_session)
):
"""获取系统配置"""
try:
config_manager = ConfigManager(db)
config = await config_manager.get_config()
logger.info("获取系统配置成功")
return config
except DatabaseError as e:
logger.error(f"获取配置时数据库错误: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"数据库错误: {str(e)}"
)
except Exception as e:
logger.error(f"获取配置失败: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"获取配置失败: {str(e)}"
)
@router.put("/", response_model=ConfigResponse)
async def update_config(
config_update: ConfigUpdateRequest,
db: AsyncSession = Depends(get_database_session)
):
"""更新系统配置"""
try:
# 验证至少有一个配置项需要更新
if not any([config_update.database, config_update.gemini_api, config_update.data_sources]):
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="至少需要提供一个配置项进行更新"
)
config_manager = ConfigManager(db)
updated_config = await config_manager.update_config(config_update)
logger.info("更新系统配置成功")
return updated_config
except HTTPException:
raise
except ConfigurationError as e:
logger.error(f"配置错误: {str(e)}")
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"配置错误: {str(e)}"
)
except DatabaseError as e:
logger.error(f"更新配置时数据库错误: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"数据库错误: {str(e)}"
)
except Exception as e:
logger.error(f"更新配置失败: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"更新配置失败: {str(e)}"
)
@router.post("/test", response_model=ConfigTestResponse)
async def test_config(
test_request: ConfigTestRequest,
db: AsyncSession = Depends(get_database_session)
):
"""测试配置连接"""
try:
# 验证配置类型
valid_types = ["database", "gemini", "data_source"]
if test_request.config_type not in valid_types:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"不支持的配置类型: {test_request.config_type},支持的类型: {valid_types}"
)
config_manager = ConfigManager(db)
test_result = await config_manager.test_config(
test_request.config_type,
test_request.config_data
)
logger.info(f"配置测试完成: {test_request.config_type}, 结果: {test_result.success}")
return test_result
except HTTPException:
raise
except ConfigurationError as e:
logger.error(f"配置测试错误: {str(e)}")
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"配置测试错误: {str(e)}"
)
except Exception as e:
logger.error(f"配置测试失败: {str(e)}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"配置测试失败: {str(e)}"
)