Explorar el Código

feat: support fetch installed tools

Yeuoly hace 8 meses
padre
commit
0ab0fc15fc

+ 9 - 0
internal/server/controllers/tool.go

@@ -68,3 +68,12 @@ func GetTool(c *gin.Context) {
 		c.JSON(http.StatusOK, service.GetTool(request.TenantID, request.PluginID, request.Provider))
 	})
 }
+
+func CheckToolExistence(c *gin.Context) {
+	BindRequest(c, func(request struct {
+		TenantID    string                              `uri:"tenant_id" validate:"required"`
+		ProviderIDS []service.RequestCheckToolExistence `json:"provider_ids" validate:"required,dive"`
+	}) {
+		c.JSON(http.StatusOK, service.CheckToolExistence(request.TenantID, request.ProviderIDS))
+	})
+}

+ 1 - 0
internal/server/http_server.go

@@ -131,6 +131,7 @@ func (app *App) pluginManagementGroup(group *gin.RouterGroup, config *app.Config
 	group.GET("/models", gzip.Gzip(gzip.DefaultCompression), controllers.ListModels)
 	group.GET("/tools", gzip.Gzip(gzip.DefaultCompression), controllers.ListTools)
 	group.GET("/tool", gzip.Gzip(gzip.DefaultCompression), controllers.GetTool)
+	group.POST("/tools/check_existence", controllers.CheckToolExistence)
 }
 
 func (app *App) pluginAssetGroup(group *gin.RouterGroup) {

+ 35 - 0
internal/service/manage_plugin.go

@@ -227,3 +227,38 @@ func GetTool(tenant_id string, plugin_id string, provider string) *entities.Resp
 
 	return entities.NewSuccessResponse(tool)
 }
+
+type RequestCheckToolExistence struct {
+	PluginID     string `json:"plugin_id" validate:"required"`
+	ProviderName string `json:"provider_name" validate:"required"`
+}
+
+func CheckToolExistence(tenantId string, providerIds []RequestCheckToolExistence) *entities.Response {
+	existence := make([]bool, 0, len(providerIds))
+
+	// get all providers
+	providers, err := db.GetAll[models.ToolInstallation](
+		db.Equal("tenant_id", tenantId),
+		db.InArray("plugin_id", strings.Map(providerIds, func(id RequestCheckToolExistence) any { return id.PluginID })),
+		db.Page(1, 256), // TODO: pagination
+	)
+
+	if err != nil {
+		return exception.InternalServerError(err).ToResponse()
+	}
+
+	// check provider id
+	for _, providerId := range providerIds {
+		found := false
+		for _, provider := range providers {
+			if provider.PluginID == providerId.PluginID && provider.Provider == providerId.ProviderName {
+				found = true
+				break
+			}
+		}
+
+		existence = append(existence, found)
+	}
+
+	return entities.NewSuccessResponse(existence)
+}