from typing import Annotated, Any
from fastapi import APIRouter, Depends, HTTPException
from app.core.deps import get_current_user, require_admin
from app.schemas.settings import AiSettings, SettingsResponse, SettingsUpdate
from app.services.settings_store import load_settings, mask_settings_for_response, save_settings
router = APIRouter(tags=["settings"], dependencies=[Depends(get_current_user)])
@router.get("/api/settings", response_model=SettingsResponse)
async def get_settings():
data = load_settings()
masked = mask_settings_for_response(data)
return SettingsResponse(
ai=AiSettings(**masked["ai"]),
agents=masked["agents"],
)
@router.put("/api/settings", response_model=SettingsResponse)
async def update_settings(
payload: SettingsUpdate,
_admin: Annotated[dict[str, Any], Depends(require_admin)],
):
if not payload.ai:
raise HTTPException(status_code=400, detail="请提供 AI 配置")
current = load_settings()
ai = {**current["ai"], **payload.ai.model_dump()}
if payload.ai.api_key == "********":
ai["api_key"] = current["ai"].get("api_key") or ""
try:
data = save_settings({"ai": ai})
except Exception as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
masked = mask_settings_for_response(data)
return SettingsResponse(
ai=AiSettings(**masked["ai"]),
agents=masked["agents"],
)