Sfoglia il codice sorgente

fix: sort embed mcp server (#251)

* fix: sort embed mcp server

* chore: swag
zijiren 6 mesi fa
parent
commit
b131af7d7b

+ 47 - 10
core/controller/mcp/embedmcp.go

@@ -46,16 +46,21 @@ func newEmbedMCPConfigTemplates(templates mcpservers.ConfigTemplates) EmbedMCPCo
 }
 
 type EmbedMCP struct {
-	ID              string                  `json:"id"`
-	Enabled         bool                    `json:"enabled"`
-	Name            string                  `json:"name"`
-	Readme          string                  `json:"readme"`
-	GitHubURL       string                  `json:"github_url"`
-	Tags            []string                `json:"tags"`
-	ConfigTemplates EmbedMCPConfigTemplates `json:"config_templates"`
+	ID              string                    `json:"id"`
+	Enabled         bool                      `json:"enabled"`
+	Name            string                    `json:"name"`
+	Readme          string                    `json:"readme"`
+	GitHubURL       string                    `json:"github_url"`
+	Tags            []string                  `json:"tags"`
+	ConfigTemplates EmbedMCPConfigTemplates   `json:"config_templates"`
+	EmbedConfig     *model.MCPEmbeddingConfig `json:"embed_config"`
 }
 
-func newEmbedMCP(mcp *mcpservers.McpServer, enabled bool) *EmbedMCP {
+func newEmbedMCP(
+	mcp *mcpservers.McpServer,
+	enabled bool,
+	embedConfig *model.MCPEmbeddingConfig,
+) *EmbedMCP {
 	emcp := &EmbedMCP{
 		ID:              mcp.ID,
 		Enabled:         enabled,
@@ -64,6 +69,7 @@ func newEmbedMCP(mcp *mcpservers.McpServer, enabled bool) *EmbedMCP {
 		GitHubURL:       mcp.GitHubURL,
 		Tags:            mcp.Tags,
 		ConfigTemplates: newEmbedMCPConfigTemplates(mcp.ConfigTemplates),
+		EmbedConfig:     embedConfig,
 	}
 	return emcp
 }
@@ -80,7 +86,13 @@ func newEmbedMCP(mcp *mcpservers.McpServer, enabled bool) *EmbedMCP {
 //	@Router			/api/embedmcp/ [get]
 func GetEmbedMCPs(c *gin.Context) {
 	embeds := mcpservers.Servers()
-	enabledMCPs, err := model.GetPublicMCPsEnabled(slices.Collect(maps.Keys(embeds)))
+	embedIDs := slices.Collect(maps.Keys(embeds))
+	enabledMCPs, err := model.GetPublicMCPsEnabled(embedIDs)
+	if err != nil {
+		middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
+		return
+	}
+	embedConfigs, err := model.GetPublicMCPsEmbedConfig(embedIDs)
 	if err != nil {
 		middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
 		return
@@ -88,9 +100,34 @@ func GetEmbedMCPs(c *gin.Context) {
 
 	emcps := make([]*EmbedMCP, 0, len(embeds))
 	for _, mcp := range embeds {
-		emcps = append(emcps, newEmbedMCP(&mcp, slices.Contains(enabledMCPs, mcp.ID)))
+		enabled := slices.Contains(enabledMCPs, mcp.ID)
+		var embedConfig *model.MCPEmbeddingConfig
+		if c, ok := embedConfigs[mcp.ID]; ok {
+			embedConfig = &c
+		}
+		emcps = append(
+			emcps,
+			newEmbedMCP(
+				&mcp,
+				enabled,
+				embedConfig,
+			),
+		)
 	}
 
+	slices.SortFunc(emcps, func(a, b *EmbedMCP) int {
+		if a.Name != b.Name {
+			return strings.Compare(a.Name, b.Name)
+		}
+		if a.Enabled != b.Enabled {
+			if a.Enabled {
+				return -1
+			}
+			return 1
+		}
+		return strings.Compare(a.ID, b.ID)
+	})
+
 	middleware.SuccessResponse(c, emcps)
 }
 

+ 3 - 0
core/docs/docs.go

@@ -8129,6 +8129,9 @@ const docTemplate = `{
                 "config_templates": {
                     "$ref": "#/definitions/controller.EmbedMCPConfigTemplates"
                 },
+                "embed_config": {
+                    "$ref": "#/definitions/model.MCPEmbeddingConfig"
+                },
                 "enabled": {
                     "type": "boolean"
                 },

+ 3 - 0
core/docs/swagger.json

@@ -8120,6 +8120,9 @@
                 "config_templates": {
                     "$ref": "#/definitions/controller.EmbedMCPConfigTemplates"
                 },
+                "embed_config": {
+                    "$ref": "#/definitions/model.MCPEmbeddingConfig"
+                },
                 "enabled": {
                     "type": "boolean"
                 },

+ 2 - 0
core/docs/swagger.yaml

@@ -157,6 +157,8 @@ definitions:
     properties:
       config_templates:
         $ref: '#/definitions/controller.EmbedMCPConfigTemplates'
+      embed_config:
+        $ref: '#/definitions/model.MCPEmbeddingConfig'
       enabled:
         type: boolean
       github_url:

+ 19 - 0
core/model/publicmcp.go

@@ -370,6 +370,25 @@ func GetPublicMCPsEnabled(ids []string) ([]string, error) {
 	return mcpIDs, nil
 }
 
+func GetPublicMCPsEmbedConfig(ids []string) (map[string]MCPEmbeddingConfig, error) {
+	var configs []struct {
+		ID          string
+		EmbedConfig MCPEmbeddingConfig `gorm:"serializer:fastjson;type:text"`
+	}
+	err := DB.Model(&PublicMCP{}).
+		Select("id, embed_config").
+		Where("id IN (?)", ids).
+		Find(&configs).Error
+	if err != nil {
+		return nil, err
+	}
+	configsMap := make(map[string]MCPEmbeddingConfig)
+	for _, config := range configs {
+		configsMap[config.ID] = config.EmbedConfig
+	}
+	return configsMap, nil
+}
+
 func SavePublicMCPReusingParam(param *PublicMCPReusingParam) (err error) {
 	defer func() {
 		if err == nil {