初始化提交
This commit is contained in:
+201
@@ -0,0 +1,201 @@
|
||||
# ///
|
||||
# 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
|
||||
Reference in New Issue
Block a user