Browse Source

feat: installation lifetime

Yeuoly 10 months ago
parent
commit
d0bc14a515

+ 16 - 2
internal/server/controllers/plugins.go

@@ -57,14 +57,28 @@ func InstallPluginFromIdentifier(app *app.Config) gin.HandlerFunc {
 	return func(c *gin.Context) {
 	return func(c *gin.Context) {
 		BindRequest(c, func(request struct {
 		BindRequest(c, func(request struct {
 			TenantID               string                                 `uri:"tenant_id" validate:"required"`
 			TenantID               string                                 `uri:"tenant_id" validate:"required"`
-			PluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier `json:"plugin_unique_identifier" validate:"required" validate:"plugin_unique_identifier"`
+			PluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier `json:"plugin_unique_identifier" validate:"required,plugin_unique_identifier"`
 		}) {
 		}) {
-			c.JSON(http.StatusOK, service.InstallPluginFromIdentifier(c, request.TenantID, request.PluginUniqueIdentifier))
+			c.JSON(http.StatusOK, service.InstallPluginFromIdentifier(request.TenantID, request.PluginUniqueIdentifier))
 		})
 		})
 	}
 	}
 }
 }
 
 
 func UninstallPlugin(c *gin.Context) {
 func UninstallPlugin(c *gin.Context) {
+	BindRequest(c, func(request struct {
+		TenantID               string                                 `uri:"tenant_id" validate:"required"`
+		PluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier `json:"plugin_unique_identifier" validate:"required,plugin_unique_identifier"`
+	}) {
+		c.JSON(http.StatusOK, service.UninstallPlugin(request.TenantID, request.PluginUniqueIdentifier))
+	})
+}
+
+func FetchPluginFromIdentifier(c *gin.Context) {
+	BindRequest(c, func(request struct {
+		PluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier `form:"plugin_unique_identifier" validate:"required,plugin_unique_identifier"`
+	}) {
+		c.JSON(http.StatusOK, service.FetchPluginFromIdentifier(request.PluginUniqueIdentifier))
+	})
 }
 }
 
 
 func ListPlugins(c *gin.Context) {
 func ListPlugins(c *gin.Context) {

+ 1 - 0
internal/server/http_server.go

@@ -103,6 +103,7 @@ func (app *App) pluginGroup(group *gin.RouterGroup, config *app.Config) {
 	group.GET("/asset/:id", controllers.GetAsset)
 	group.GET("/asset/:id", controllers.GetAsset)
 	group.POST("/:tenant_id/install/pkg", controllers.InstallPluginFromPkg(config))
 	group.POST("/:tenant_id/install/pkg", controllers.InstallPluginFromPkg(config))
 	group.POST("/:tenant_id/install/identifier", controllers.InstallPluginFromIdentifier(config))
 	group.POST("/:tenant_id/install/identifier", controllers.InstallPluginFromIdentifier(config))
+	group.GET("/:tenant_id/fetch/identifier", controllers.FetchPluginFromIdentifier)
 	group.POST("/:tenant_id/uninstall", controllers.UninstallPlugin)
 	group.POST("/:tenant_id/uninstall", controllers.UninstallPlugin)
 	group.GET("/:tenant_id/list", controllers.ListPlugins)
 	group.GET("/:tenant_id/list", controllers.ListPlugins)
 	group.GET("/:tenant_id/models", controllers.ListModels)
 	group.GET("/:tenant_id/models", controllers.ListModels)

+ 43 - 2
internal/service/install_plugin.go

@@ -1,6 +1,7 @@
 package service
 package service
 
 
 import (
 import (
+	"fmt"
 	"io"
 	"io"
 	"mime/multipart"
 	"mime/multipart"
 
 
@@ -40,7 +41,6 @@ func InstallPluginFromPkg(c *gin.Context, tenant_id string, dify_pkg_file multip
 }
 }
 
 
 func InstallPluginFromIdentifier(
 func InstallPluginFromIdentifier(
-	c *gin.Context,
 	tenant_id string,
 	tenant_id string,
 	plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
 	plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
 ) *entities.Response {
 ) *entities.Response {
@@ -61,5 +61,46 @@ func InstallPluginFromIdentifier(
 		return entities.NewErrorResponse(-500, err.Error())
 		return entities.NewErrorResponse(-500, err.Error())
 	}
 	}
 
 
-	return entities.NewSuccessResponse(plugin)
+	return entities.NewSuccessResponse(true)
+}
+
+func FetchPluginFromIdentifier(
+	plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
+) *entities.Response {
+	_, err := db.GetOne[models.Plugin](
+		db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
+	)
+	if err == db.ErrDatabaseNotFound {
+		return entities.NewSuccessResponse(false)
+	}
+	if err != nil {
+		return entities.NewErrorResponse(-500, err.Error())
+	}
+
+	return entities.NewSuccessResponse(true)
+}
+
+func UninstallPlugin(
+	tenant_id string,
+	plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
+) *entities.Response {
+	// Check if the plugin exists for the tenant
+	installation, err := db.GetOne[models.PluginInstallation](
+		db.Equal("tenant_id", tenant_id),
+		db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
+	)
+	if err == db.ErrDatabaseNotFound {
+		return entities.NewErrorResponse(-404, "Plugin not found for this tenant")
+	}
+	if err != nil {
+		return entities.NewErrorResponse(-500, err.Error())
+	}
+
+	// Uninstall the plugin
+	_, err = curd.DeletePlugin(tenant_id, plugin_unique_identifier, installation.ID)
+	if err != nil {
+		return entities.NewErrorResponse(-500, fmt.Sprintf("Failed to uninstall plugin: %s", err.Error()))
+	}
+
+	return entities.NewSuccessResponse(true)
 }
 }