202 lines
6.8 KiB
Python
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
|