mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
✨ 新增重命名菜单类型接口
This commit is contained in:
parent
c4f8d899d9
commit
ab0021e1a8
@ -15,6 +15,7 @@ from .model import (
|
|||||||
PluginSwitch,
|
PluginSwitch,
|
||||||
UpdatePlugin,
|
UpdatePlugin,
|
||||||
BatchUpdatePlugins,
|
BatchUpdatePlugins,
|
||||||
|
RenameMenuTypePayload,
|
||||||
)
|
)
|
||||||
|
|
||||||
router = APIRouter(prefix="/plugin")
|
router = APIRouter(prefix="/plugin")
|
||||||
@ -167,3 +168,28 @@ async def batch_update_plugin_config_api(params: BatchUpdatePlugins):
|
|||||||
# raise HTTPException(status_code=400, detail={"message": "部分插件更新失败", "errors": result["errors"]})
|
# raise HTTPException(status_code=400, detail={"message": "部分插件更新失败", "errors": result["errors"]})
|
||||||
pass # 暂时只返回结果字典
|
pass # 暂时只返回结果字典
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
# 新增:重命名菜单类型路由
|
||||||
|
@router.put(
|
||||||
|
"/menu_type/rename",
|
||||||
|
dependencies=[authentication()],
|
||||||
|
response_model=Result,
|
||||||
|
summary="重命名菜单类型"
|
||||||
|
)
|
||||||
|
async def rename_menu_type_api(payload: RenameMenuTypePayload) -> Result:
|
||||||
|
try:
|
||||||
|
result = await ApiDataSource.rename_menu_type(old_name=payload.old_name, new_name=payload.new_name)
|
||||||
|
if result.get("success"):
|
||||||
|
return Result.ok(info=result.get("info", f"成功将 {result.get('updated_count', 0)} 个插件的菜单类型从 '{payload.old_name}' 修改为 '{payload.new_name}'"))
|
||||||
|
else:
|
||||||
|
# 这种情况理论上不会发生,因为 rename_menu_type 失败会抛异常
|
||||||
|
return Result.fail(info=result.get("info", "重命名失败"))
|
||||||
|
except ValueError as ve:
|
||||||
|
return Result.fail(info=str(ve))
|
||||||
|
except RuntimeError as re:
|
||||||
|
logger.error(f"{router.prefix}/menu_type/rename 调用错误", "WebUi", e=re)
|
||||||
|
return Result.fail(info=str(re))
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"{router.prefix}/menu_type/rename 调用错误", "WebUi", e=e)
|
||||||
|
return Result.fail(info=f"发生未知错误: {type(e).__name__}")
|
||||||
|
|||||||
@ -203,6 +203,35 @@ class ApiDataSource:
|
|||||||
type_inner=type_inner, # type: ignore
|
type_inner=type_inner, # type: ignore
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def rename_menu_type(cls, old_name: str, new_name: str) -> dict:
|
||||||
|
"""重命名菜单类型,并更新所有相关插件
|
||||||
|
|
||||||
|
参数:
|
||||||
|
old_name: 旧菜单类型名称
|
||||||
|
new_name: 新菜单类型名称
|
||||||
|
|
||||||
|
返回:
|
||||||
|
dict: 更新结果, 例如 {'success': True, 'updated_count': 3}
|
||||||
|
"""
|
||||||
|
if not old_name or not new_name:
|
||||||
|
raise ValueError("旧名称和新名称都不能为空")
|
||||||
|
if old_name == new_name:
|
||||||
|
return {"success": True, "updated_count": 0, "info": "新旧名称相同,无需更新"}
|
||||||
|
|
||||||
|
# 检查新名称是否已存在(理论上前端会校验,后端再保险一次)
|
||||||
|
exists = await DbPluginInfo.filter(menu_type=new_name).exists()
|
||||||
|
if exists:
|
||||||
|
raise ValueError(f"新的菜单类型名称 '{new_name}' 已被其他插件使用")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 使用 filter().update() 进行批量更新
|
||||||
|
updated_count = await DbPluginInfo.filter(menu_type=old_name).update(menu_type=new_name)
|
||||||
|
return {"success": True, "updated_count": updated_count}
|
||||||
|
except Exception as e:
|
||||||
|
# 可以添加更详细的日志记录
|
||||||
|
raise RuntimeError(f"数据库更新菜单类型失败: {str(e)}")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def get_plugin_detail(cls, module: str) -> PluginDetail:
|
async def get_plugin_detail(cls, module: str) -> PluginDetail:
|
||||||
"""获取插件详情
|
"""获取插件详情
|
||||||
|
|||||||
@ -128,6 +128,11 @@ class PluginDetail(PluginInfo):
|
|||||||
config_list: list[PluginConfig]
|
config_list: list[PluginConfig]
|
||||||
|
|
||||||
|
|
||||||
|
class RenameMenuTypePayload(BaseModel):
|
||||||
|
old_name: str = Field(..., description="旧菜单类型名称")
|
||||||
|
new_name: str = Field(..., description="新菜单类型名称")
|
||||||
|
|
||||||
|
|
||||||
class PluginIr(BaseModel):
|
class PluginIr(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
"""插件id"""
|
"""插件id"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user