Files
2025-08-21 18:01:09 +08:00

193 lines
7.9 KiB
Python

from server import PromptServer
from aiohttp import web
from typing import Dict, Any
import logging
from ..dao.expert_table import (
create_rewrite_expert,
get_rewrite_expert,
list_rewrite_experts,
update_rewrite_expert_by_id,
delete_rewrite_expert_by_id
)
# 配置日志
logger = logging.getLogger(__name__)
def validate_expert_data(data: Dict[str, Any]) -> tuple[bool, str, Dict[str, Any]]:
"""验证专家数据"""
if not data:
return False, "请求数据不能为空", {}
# 验证必填字段
if 'name' not in data or not data['name']:
return False, "名称不能为空", {}
# 验证字段类型和长度
if not isinstance(data['name'], str) or len(data['name']) > 255:
return False, "名称必须是字符串且长度不超过255个字符", {}
# 验证可选字段
validated_data = {
'name': data['name'].strip(),
'description': data.get('description'),
'content': data.get('content')
}
return True, "", validated_data
@PromptServer.instance.routes.post("/api/expert/experts")
async def create_expert(request):
"""创建新的专家记录"""
try:
data = await request.json()
if not data:
return web.json_response({"success": False, "message": "请求数据格式错误", "data": None}, status=400)
# 验证数据
is_valid, error_msg, validated_data = validate_expert_data(data)
if not is_valid:
return web.json_response({"success": False, "message": error_msg, "data": None}, status=400)
# 创建专家记录
expert_id = create_rewrite_expert(
name=validated_data['name'],
description=validated_data['description'],
content=validated_data['content']
)
logger.info(f"成功创建专家记录,ID: {expert_id}")
return web.json_response({"success": True, "message": "创建成功", "data": {"id": expert_id}}, status=200)
except Exception as e:
logger.error(f"创建专家记录失败: {str(e)}")
return web.json_response({"success": False, "message": f"创建失败: {str(e)}", "data": None}, status=500)
@PromptServer.instance.routes.get("/api/expert/experts")
async def get_experts(request):
"""获取所有专家记录列表"""
try:
experts = list_rewrite_experts()
logger.info(f"成功获取专家记录列表,共 {len(experts)} 条")
return web.json_response({"success": True, "message": "获取列表成功", "data": {"total": len(experts), "experts": experts}}, status=200)
except Exception as e:
logger.error(f"获取专家记录列表失败: {str(e)}")
return web.json_response({"success": False, "message": f"获取列表失败: {str(e)}", "data": None}, status=500)
@PromptServer.instance.routes.get("/api/expert/experts/{expert_id}")
async def get_expert_by_id(request):
"""根据ID获取专家记录"""
try:
expert_id = int(request.match_info['expert_id'])
expert = get_rewrite_expert(expert_id)
if not expert:
return web.json_response({"success": False, "message": "ID不存在", "data": None}, status=404)
logger.info(f"成功获取专家记录,ID: {expert_id}")
return web.json_response({"success": True, "message": "获取记录成功", "data": expert}, status=200)
except Exception as e:
logger.error(f"获取专家记录失败,ID: {expert_id}, 错误: {str(e)}")
return web.json_response({"success": False, "message": f"获取记录失败: {str(e)}", "data": None}, status=500)
@PromptServer.instance.routes.put("/api/expert/experts/{expert_id}")
async def update_expert(request):
"""更新专家记录"""
try:
expert_id = int(request.match_info['expert_id'])
data = await request.json()
if not data:
return web.json_response({"success": False, "message": "请求数据格式错误", "data": None}, status=400)
# 验证数据
is_valid, error_msg, validated_data = validate_expert_data(data)
if not is_valid:
return web.json_response({"success": False, "message": error_msg, "data": None}, status=400)
# 更新专家记录
success = update_rewrite_expert_by_id(
expert_id=expert_id,
name=validated_data.get('name'),
description=validated_data.get('description'),
content=validated_data.get('content')
)
if not success:
return web.json_response({"success": False, "message": "ID不存在", "data": None}, status=404)
logger.info(f"成功更新专家记录,ID: {expert_id}")
return web.json_response({"success": True, "message": "更新成功", "data": {"id": expert_id}}, status=200)
except Exception as e:
logger.error(f"更新专家记录失败,ID: {expert_id}, 错误: {str(e)}")
return web.json_response({"success": False, "message": f"更新失败: {str(e)}", "data": None}, status=500)
@PromptServer.instance.routes.delete("/api/expert/experts/{expert_id}")
async def delete_expert(request):
"""删除专家记录"""
try:
expert_id = int(request.match_info['expert_id'])
success = delete_rewrite_expert_by_id(expert_id)
if not success:
return web.json_response({"success": False, "message": "ID不存在", "data": None}, status=404)
logger.info(f"成功删除专家记录,ID: {expert_id}")
return web.json_response({"success": True, "message": "删除成功", "data": {"id": expert_id}}, status=200)
except Exception as e:
logger.error(f"删除专家记录失败,ID: {expert_id}, 错误: {str(e)}")
return web.json_response({"success": False, "message": f"删除失败: {str(e)}", "data": None}, status=500)
@PromptServer.instance.routes.patch("/api/expert/experts/{expert_id}")
async def partial_update_expert(request):
"""部分更新专家记录"""
try:
expert_id = int(request.match_info['expert_id'])
data = await request.json()
if not data:
return web.json_response({"success": False, "message": "请求数据格式错误", "data": None}, status=400)
# 验证字段
update_data = {}
if 'name' in data:
if not isinstance(data['name'], str) or len(data['name']) > 255:
return web.json_response({"success": False, "message": "名称必须是字符串且长度不超过255个字符", "data": None}, status=400)
update_data['name'] = data['name'].strip()
if 'description' in data:
update_data['description'] = data['description']
if 'content' in data:
update_data['content'] = data['content']
if not update_data:
return web.json_response({"success": False, "message": "没有提供要更新的字段", "data": None}, status=400)
# 更新专家记录
success = update_rewrite_expert_by_id(
expert_id=expert_id,
**update_data
)
if not success:
return web.json_response({"success": False, "message": "ID不存在", "data": None}, status=404)
logger.info(f"成功部分更新专家记录,ID: {expert_id}")
return web.json_response({"success": True, "message": "更新成功", "data": {"id": expert_id}}, status=200)
except Exception as e:
logger.error(f"部分更新专家记录失败,ID: {expert_id}, 错误: {str(e)}")
return web.json_response({"success": False, "message": f"更新失败: {str(e)}", "data": None}, status=500)
# 路由配置函数
# 所有路由已通过装饰器自动注册到 ComfyUI 的 PromptServer