From 223e655b6f1e97c8c60020a742b4e53811cd2df4 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 13 May 2024 20:15:47 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=8F=92=E4=BB=B6API=E7=AB=8B?= =?UTF-8?q?=E5=8D=B3=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/endpoints/plugin.py | 36 +++++++++++++++++++++++++++++++++--- app/core/plugin.py | 4 +++- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/app/api/endpoints/plugin.py b/app/api/endpoints/plugin.py index 2bc1b902..0117c3f5 100644 --- a/app/api/endpoints/plugin.py +++ b/app/api/endpoints/plugin.py @@ -13,6 +13,29 @@ from app.schemas.types import SystemConfigKey router = APIRouter() +def register_plugin_api(plugin_id: str = None): + """ + 注册插件API(先删除后新增) + """ + for api in PluginManager().get_plugin_apis(plugin_id): + for r in router.routes: + if r.path == api.get("path"): + router.routes.remove(r) + break + router.add_api_route(**api) + + +def remove_plugin_api(plugin_id: str): + """ + 移除插件API + """ + for api in PluginManager().get_plugin_apis(plugin_id): + for r in router.routes: + if r.path == api.get("path"): + router.routes.remove(r) + break + + @router.get("/", summary="所有插件", response_model=List[schemas.Plugin]) def all_plugins(_: schemas.TokenPayload = Depends(verify_token), state: str = "all") -> List[schemas.Plugin]: """ @@ -101,6 +124,8 @@ def install(plugin_id: str, PluginManager().reload_plugin(plugin_id) # 注册插件服务 Scheduler().update_plugin_job(plugin_id) + # 注册插件API + register_plugin_api(plugin_id) return schemas.Response(success=True) @@ -155,6 +180,8 @@ def reset_plugin(plugin_id: str, _: schemas.TokenPayload = Depends(verify_token) }) # 注册插件服务 Scheduler().update_plugin_job(plugin_id) + # 注册插件API + register_plugin_api(plugin_id) return schemas.Response(success=True) @@ -178,6 +205,8 @@ def set_plugin_config(plugin_id: str, conf: dict, PluginManager().init_plugin(plugin_id, conf) # 注册插件服务 Scheduler().update_plugin_job(plugin_id) + # 注册插件API + register_plugin_api(plugin_id) return schemas.Response(success=True) @@ -199,9 +228,10 @@ def uninstall_plugin(plugin_id: str, PluginManager().remove_plugin(plugin_id) # 移除插件服务 Scheduler().remove_plugin_job(plugin_id) + # 移除插件API + remove_plugin_api(plugin_id) return schemas.Response(success=True) -# 注册插件API -for api in PluginManager().get_plugin_apis(): - router.add_api_route(**api) +# 注册全部插件API +register_plugin_api() diff --git a/app/core/plugin.py b/app/core/plugin.py index f2076fb7..cf0b23af 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -378,7 +378,7 @@ class PluginManager(metaclass=Singleton): logger.error(f"获取插件命令出错:{str(e)}") return ret_commands - def get_plugin_apis(self) -> List[Dict[str, Any]]: + def get_plugin_apis(self, plugin_id: str = None) -> List[Dict[str, Any]]: """ 获取插件API [{ @@ -391,6 +391,8 @@ class PluginManager(metaclass=Singleton): """ ret_apis = [] for pid, plugin in self._running_plugins.items(): + if plugin_id and pid != plugin_id: + continue if hasattr(plugin, "get_api") \ and ObjectUtils.check_method(plugin.get_api): try: