Files
2026-06-03 15:34:38 +08:00

102 lines
2.5 KiB
Go

package plugin
import (
"context"
"encoding/json"
"github.com/gogf/gf/v2/frame/g"
"github.com/qianfree/team-api/internal/dao"
do "github.com/qianfree/team-api/internal/model/do"
)
// GetPluginConfig 获取插件全局配置。
func GetPluginConfig(ctx context.Context, pluginName string) (g.Map, error) {
record, err := dao.SysPlugins.Ctx(ctx).
Where("name", pluginName).
Fields("config").
One()
if err != nil {
return nil, err
}
if record == nil {
return g.Map{}, nil
}
var config g.Map
configStr := record["config"].String()
if configStr == "" || configStr == "{}" {
return g.Map{}, nil
}
if err := json.Unmarshal([]byte(configStr), &config); err != nil {
return nil, err
}
return config, nil
}
// GetPluginConfigForTenant 获取租户级插件配置(优先使用租户覆盖,否则使用全局配置)。
func GetPluginConfigForTenant(ctx context.Context, pluginName string, tenantID int64) (g.Map, error) {
record, err := dao.TntTenantPlugins.Ctx(ctx).
Where("tenant_id = ? AND plugin_name = ?", tenantID, pluginName).
Fields("config").
One()
if err != nil {
return nil, err
}
if record != nil {
configStr := record["config"].String()
if configStr != "" && configStr != "{}" {
var config g.Map
if err := json.Unmarshal([]byte(configStr), &config); err != nil {
return nil, err
}
return config, nil
}
}
return GetPluginConfig(ctx, pluginName)
}
// UpdatePluginConfig 更新插件全局配置。
func UpdatePluginConfig(ctx context.Context, pluginName string, config g.Map) error {
configJSON, err := json.Marshal(config)
if err != nil {
return err
}
_, err = dao.SysPlugins.Ctx(ctx).
Where("name", pluginName).
Data(do.SysPlugins{Config: string(configJSON)}).
Update()
return err
}
// UpdatePluginConfigForTenant 更新租户级插件配置。
func UpdatePluginConfigForTenant(ctx context.Context, pluginName string, tenantID int64, config g.Map) error {
configJSON, err := json.Marshal(config)
if err != nil {
return err
}
_, err = dao.TntTenantPlugins.Ctx(ctx).
Data(do.TntTenantPlugins{
TenantId: tenantID,
PluginName: pluginName,
Config: string(configJSON),
}).
OnConflict("tenant_id,plugin_name").
Save()
return err
}
// GetConfigSchema 获取插件配置 schema(如果插件实现了 Configurable)。
func GetConfigSchema(pluginName string) []ConfigFieldDef {
entry := GetPlugin(pluginName)
if entry == nil {
return nil
}
if c, ok := entry.Plugin.(Configurable); ok {
return c.ConfigSchema()
}
return nil
}