Files
companion-assistant/backend/app/api/config.py
T

76 lines
2.6 KiB
Python

"""系统配置路由:
- GET /api/config/ui 公开 UI 配置(前端启动时拉取,无需登录)
- GET /api/admin/config 管理端读取配置(admin)
- PUT /api/admin/config 管理端保存配置(admin)
- GET /api/admin/stats 管理端统计(admin)
"""
import json
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy.orm import Session
from ..core.deps import get_current_user
from ..core.response import ok
from ..database import get_db
from ..models import Agent, ChatMessage, ChatSession, Project, Task, User
from ..services.chat_service import get_ui_config
from ..services.default_config import DEFAULT_UI_CONFIG
router = APIRouter(tags=["配置"])
def require_admin(user: User = Depends(get_current_user)) -> User:
if user.role != "admin":
raise HTTPException(status_code=403, detail="需要管理员权限")
return user
@router.get("/config/ui")
def ui_config(db: Session = Depends(get_db)):
"""公开:前端渲染所需的界面配置。"""
return ok(get_ui_config(db))
@router.get("/admin/config")
def get_admin_config(user: User = Depends(require_admin), db: Session = Depends(get_db)):
from ..models import AppConfig
row = db.get(AppConfig, "ui")
stored = {}
if row and row.value:
try:
stored = json.loads(row.value)
except json.JSONDecodeError:
stored = {}
return ok({"defaults": DEFAULT_UI_CONFIG, "stored": stored, "effective": get_ui_config(db)})
class AdminConfigBody(BaseModel):
config: dict
@router.put("/admin/config")
def put_admin_config(body: AdminConfigBody, user: User = Depends(require_admin), db: Session = Depends(get_db)):
from ..models import AppConfig
row = db.get(AppConfig, "ui")
if not row:
row = AppConfig(key="ui", value="{}")
db.add(row)
row.value = json.dumps(body.config, ensure_ascii=False)
db.commit()
return ok(get_ui_config(db), "已保存")
@router.get("/admin/stats")
def admin_stats(user: User = Depends(require_admin), db: Session = Depends(get_db)):
return ok({
"users": db.query(User).count(),
"sessions": db.query(ChatSession).count(),
"messages": db.query(ChatMessage).count(),
"projects": db.query(Project).count(),
"tasks": db.query(Task).count(),
"agents": db.query(Agent).count(),
"likes": db.query(ChatMessage).filter(ChatMessage.feedback == "like").count(),
"dislikes": db.query(ChatMessage).filter(ChatMessage.feedback == "dislike").count(),
})