Procházet zdrojové kódy

feat: uninstall plugins

Yeuoly před 6 měsíci
rodič
revize
a9c21ef929

+ 19 - 0
api/controllers/console/workspace/plugin.py

@@ -115,9 +115,28 @@ class PluginInstallFromPkgApi(Resource):
         return Response(generator(), mimetype="text/event-stream")
 
 
+class PluginUninstallApi(Resource):
+    @setup_required
+    @login_required
+    @account_initialization_required
+    def post(self):
+        req = reqparse.RequestParser()
+        req.add_argument("plugin_installation_id", type=str, required=True, location="json")
+        args = req.parse_args()
+
+        user = current_user
+        if not user.is_admin_or_owner:
+            raise Forbidden()
+
+        tenant_id = user.current_tenant_id
+
+        return {"success": PluginService.uninstall_plugin(tenant_id, args["plugin_installation_id"])}
+
+
 api.add_resource(PluginDebuggingKeyApi, "/workspaces/current/plugin/debugging-key")
 api.add_resource(PluginListApi, "/workspaces/current/plugin/list")
 api.add_resource(PluginIconApi, "/workspaces/current/plugin/icon")
 api.add_resource(PluginInstallCheckUniqueIdentifierApi, "/workspaces/current/plugin/install/check_unique_identifier")
 api.add_resource(PluginInstallFromUniqueIdentifierApi, "/workspaces/current/plugin/install/from_unique_identifier")
 api.add_resource(PluginInstallFromPkgApi, "/workspaces/current/plugin/install/from_pkg")
+api.add_resource(PluginUninstallApi, "/workspaces/current/plugin/uninstall")

+ 3 - 3
api/core/plugin/entities/plugin.py

@@ -47,9 +47,9 @@ class PluginResourceRequirements(BaseModel):
 
 class PluginDeclaration(BaseModel):
     class Plugins(BaseModel):
-        tools: list[str] = Field(default_factory=list)
-        models: list[str] = Field(default_factory=list)
-        endpoints: list[str] = Field(default_factory=list)
+        tools: Optional[list[str]] = Field(default_factory=list)
+        models: Optional[list[str]] = Field(default_factory=list)
+        endpoints: Optional[list[str]] = Field(default_factory=list)
 
     version: str = Field(..., pattern=r"^\d{1,4}(\.\d{1,4}){1,3}(-\w{1,16})?$")
     author: Optional[str] = Field(..., pattern=r"^[a-zA-Z0-9_-]{1,64}$")

+ 3 - 3
api/core/plugin/manager/plugin.py

@@ -53,16 +53,16 @@ class PluginInstallationManager(BasePluginManager):
             headers={"Content-Type": "application/json"},
         )
 
-    def uninstall(self, tenant_id: str, identifier: str) -> bool:
+    def uninstall(self, tenant_id: str, plugin_installation_id: str) -> bool:
         """
         Uninstall a plugin.
         """
         return self._request_with_plugin_daemon_response(
-            "DELETE",
+            "POST",
             f"plugin/{tenant_id}/management/uninstall",
             bool,
             data={
-                "plugin_unique_identifier": identifier,
+                "plugin_installation_id": plugin_installation_id,
             },
             headers={"Content-Type": "application/json"},
         )

+ 5 - 0
api/services/plugin/plugin_service.py

@@ -43,3 +43,8 @@ class PluginService:
             yield from manager.install_from_pkg(tenant_id, pkg)
         except PluginDaemonInnerError as e:
             yield InstallPluginMessage(event=InstallPluginMessage.Event.Error, data=str(e.message))
+
+    @staticmethod
+    def uninstall_plugin(tenant_id: str, plugin_installation_id: str) -> bool:
+        manager = PluginInstallationManager()
+        return manager.uninstall(tenant_id, plugin_installation_id)