Files
2026-04-07 14:11:45 +08:00

202 lines
6.8 KiB
Python

# ///
# nodes.py
# 描述:节点管理API路由
# 作者:AI Generated
# 创建日期:2026-04-05
# ///
from fastapi import APIRouter, HTTPException, Depends
from typing import List, Optional, Dict, Any
from pydantic import BaseModel
from services.node_manager import node_manager
from config import save_config_to_file, get_settings, NodeConfig
from utils import require_api_key
router = APIRouter(prefix="/nodes", tags=["节点管理"])
class NodeAddRequest(BaseModel):
node_id: str
name: str
api_url: str
api_key: str
description: str = ""
group: str = "default"
class NodeUpdateRequest(BaseModel):
name: Optional[str] = None
api_url: Optional[str] = None
api_key: Optional[str] = None
description: Optional[str] = None
group: Optional[str] = None
enabled: Optional[bool] = None
def save_nodes_config():
nodes_data = node_manager.to_config()
get_settings().nodes = [NodeConfig(**n) for n in nodes_data]
save_config_to_file()
@router.get("/", summary="获取所有节点")
async def get_nodes(group: Optional[str] = None, _=Depends(require_api_key)) -> Dict[str, Any]:
from database_service import get_db_service
db_service = get_db_service()
if db_service:
nodes = db_service.get_all_nodes()
result_nodes = [n.to_dict() for n in nodes]
return {"success": True, "data": result_nodes, "count": len(result_nodes)}
if group:
nodes = await node_manager.get_nodes_by_group(group)
else:
nodes = await node_manager.get_all_nodes()
result_nodes = []
for node in nodes:
node_dict = node.to_dict()
result_nodes.append(node_dict)
return {
"success": True,
"data": result_nodes,
"count": len(result_nodes)
}
@router.get("/{node_id}", summary="获取指定节点信息")
async def get_node(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]:
from database_service import get_db_service
db_service = get_db_service()
if db_service:
node = db_service.get_node(node_id)
if node:
return {"success": True, "data": node.to_dict()}
node = await node_manager.get_node(node_id)
if not node:
raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found")
return {"success": True, "data": node.to_dict()}
@router.post("/", summary="添加节点")
async def add_node(request: NodeAddRequest, _=Depends(require_api_key)) -> Dict[str, Any]:
from database_service import get_db_service
db_service = get_db_service()
if db_service:
db_service.add_node(
node_id=request.node_id,
name=request.name,
api_url=request.api_url,
api_key=request.api_key,
description=request.description or "",
group=request.group or "default"
)
success = await node_manager.add_node(
node_id=request.node_id,
name=request.name,
api_url=request.api_url,
api_key=request.api_key,
description=request.description,
group=request.group
)
if not success:
raise HTTPException(status_code=400, detail=f"Node '{request.node_id}' already exists")
save_nodes_config()
return {"success": True, "message": f"Node '{request.node_id}' added successfully"}
@router.put("/{node_id}", summary="更新节点信息")
async def update_node(node_id: str, request: NodeUpdateRequest,
_=Depends(require_api_key)) -> Dict[str, Any]:
update_data = request.model_dump(exclude_unset=True)
from database_service import get_db_service
db_service = get_db_service()
if db_service:
db_service.update_node(node_id, **update_data)
success = await node_manager.update_node(node_id, **update_data)
if not success:
raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found")
save_nodes_config()
return {"success": True, "message": f"Node '{node_id}' updated successfully"}
@router.delete("/{node_id}", summary="删除节点")
async def delete_node(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]:
from database_service import get_db_service
db_service = get_db_service()
if db_service:
db_service.delete_node(node_id)
success = await node_manager.remove_node(node_id)
if not success:
raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found")
save_nodes_config()
return {"success": True, "message": f"Node '{node_id}' deleted successfully"}
@router.get("/{node_id}/status", summary="检查节点状态")
async def check_node_status(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]:
api_status = await node_manager.check_node_status(node_id)
is_healthy, health_msg = await node_manager.is_node_healthy(node_id)
return {
"success": True,
"data": {
"node_id": node_id,
"api_status": api_status,
"is_healthy": is_healthy,
"health_message": health_msg
}
}
@router.post("/{node_id}/enable", summary="启用节点")
async def enable_node(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]:
from database_service import get_db_service
db_service = get_db_service()
if db_service:
db_service.update_node(node_id, enabled=True)
success = await node_manager.update_node(node_id, enabled=True)
if not success:
raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found")
save_nodes_config()
return {"success": True, "message": f"Node '{node_id}' enabled"}
@router.post("/{node_id}/disable", summary="禁用节点")
async def disable_node(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]:
from database_service import get_db_service
db_service = get_db_service()
if db_service:
db_service.update_node(node_id, enabled=False)
success = await node_manager.update_node(node_id, enabled=False)
if not success:
raise HTTPException(status_code=404, detail=f"Node '{node_id}' not found")
save_nodes_config()
return {"success": True, "message": f"Node '{node_id}' disabled"}
@router.get("/{node_id}/friends", summary="获取节点好友列表")
async def get_friends(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]:
result = await node_manager.get_friends_list(node_id)
return result
@router.get("/{node_id}/groups", summary="获取节点群列表")
async def get_groups(node_id: str, _=Depends(require_api_key)) -> Dict[str, Any]:
result = await node_manager.get_groups_list(node_id)
return result
@router.get("/{node_id}/messages/{chat_name}", summary="获取聊天消息")
async def get_messages(node_id: str, chat_name: str, limit: int = 20,
_=Depends(require_api_key)) -> Dict[str, Any]:
result = await node_manager.get_messages(node_id, chat_name, limit)
return result