mirror of
https://github.com/langgenius/dify-plugin-daemon.git
synced 2026-07-23 02:05:27 -04:00
113 lines
2.7 KiB
Go
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
|
|
}
|