Files
dify-plugin-daemon/internal/service/plugin_readme.go
2025-08-27 15:57:09 +08:00

113 lines
2.7 KiB
Go

package service
import (
"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager"
"github.com/langgenius/dify-plugin-daemon/internal/db"
"github.com/langgenius/dify-plugin-daemon/internal/types/models"
"github.com/langgenius/dify-plugin-daemon/pkg/entities/plugin_entities"
"github.com/langgenius/dify-plugin-daemon/pkg/plugin_packager/decoder"
)
func GetPluginReadmeMap(
tenantId string,
pluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier,
) (map[string]string, error) {
readmeMap, err := getPluginReadmeMapFromDb(tenantId, pluginUniqueIdentifier)
if err != nil {
return nil, err
}
if readmeMap == nil {
readmeMap = make(map[string]string)
}
if len(readmeMap) == 0 {
readmeMap, err = extractInstalledPluginReadmeMap(pluginUniqueIdentifier)
if err != nil {
return nil, err
}
err := savePluginReadmeMapToDb(tenantId, pluginUniqueIdentifier, readmeMap)
if err != nil {
return nil, err
}
}
if len(readmeMap) == 0 {
return nil, nil
}
return readmeMap, nil
}
func getPluginReadmeMapFromDb(
tenantId string,
pluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier,
) (map[string]string, error) {
var readmes []models.PluginReadme
err := db.DifyPluginDB.Where(
"tenant_id = ? AND plugin_unique_identifier = ?",
tenantId, pluginUniqueIdentifier.String(),
).Find(&readmes).Error
if err != nil {
return nil, err
}
if readmes == nil {
return nil, nil
}
readmeMap := make(map[string]string)
for _, readme := range readmes {
readmeMap[readme.Language] = readme.Content
}
return readmeMap, nil
}
func extractInstalledPluginReadmeMap(
pluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier,
) (map[string]string, error) {
manager := plugin_manager.Manager()
pkgBytes, err := manager.GetPackage(pluginUniqueIdentifier)
if err != nil {
return nil, err
}
zipDecoder, err := decoder.NewZipPluginDecoder(pkgBytes)
if err != nil {
return nil, err
}
readmeMap, err := zipDecoder.AvailableI18nReadme()
if err != nil {
return nil, err
}
if readmeMap == nil {
readmeMap = make(map[string]string)
}
return readmeMap, nil
}
func savePluginReadmeMapToDb(
tenantId string,
pluginUniqueIdentifier plugin_entities.PluginUniqueIdentifier,
readmeMap map[string]string,
) error {
tx := db.DifyPluginDB.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
// Create new readme entries
for language, content := range readmeMap {
readme := models.PluginReadme{
TenantID: tenantId,
PluginUniqueIdentifier: pluginUniqueIdentifier.String(),
Language: language,
Content: content,
}
if err := tx.Create(&readme).Error; err != nil {
tx.Rollback()
return err
}
}
return tx.Commit().Error
}