Plugin settings (#4143)

* Add backend support for plugin settings
* Add plugin settings config
* Add UI support for plugin settings
This commit is contained in:
WithoutPants
2023-10-18 14:09:13 +11:00
committed by GitHub
parent 06d8353f4f
commit 2b8718100b
24 changed files with 445 additions and 57 deletions
+4
View File
@@ -84,6 +84,9 @@ func (r *Resolver) Tag() TagResolver {
func (r *Resolver) SavedFilter() SavedFilterResolver {
return &savedFilterResolver{r}
}
func (r *Resolver) ConfigResult() ConfigResultResolver {
return &configResultResolver{r}
}
type mutationResolver struct{ *Resolver }
type queryResolver struct{ *Resolver }
@@ -99,6 +102,7 @@ type studioResolver struct{ *Resolver }
type movieResolver struct{ *Resolver }
type tagResolver struct{ *Resolver }
type savedFilterResolver struct{ *Resolver }
type configResultResolver struct{ *Resolver }
func (r *Resolver) withTxn(ctx context.Context, fn func(ctx context.Context) error) error {
return r.repository.WithTxn(ctx, fn)
+25
View File
@@ -0,0 +1,25 @@
package api
import (
"context"
"github.com/stashapp/stash/internal/manager/config"
)
func (r *configResultResolver) Plugins(ctx context.Context, obj *ConfigResult, include []string) (map[string]interface{}, error) {
if len(include) == 0 {
ret := config.GetInstance().GetAllPluginConfiguration()
return ret, nil
}
ret := make(map[string]interface{})
for _, plugin := range include {
c := config.GetInstance().GetPluginConfiguration(plugin)
if len(c) > 0 {
ret[plugin] = c
}
}
return ret, nil
}
@@ -629,3 +629,14 @@ func (r *mutationResolver) ConfigureUISetting(ctx context.Context, key string, v
return r.ConfigureUI(ctx, cfg)
}
func (r *mutationResolver) ConfigurePlugin(ctx context.Context, pluginID string, input map[string]interface{}) (map[string]interface{}, error) {
c := config.GetInstance()
c.SetPluginConfiguration(pluginID, input)
if err := c.Write(); err != nil {
return c.GetPluginConfiguration(pluginID), err
}
return c.GetPluginConfiguration(pluginID), nil
}
+51 -2
View File
@@ -131,8 +131,10 @@ const (
PythonPath = "python_path"
// plugin options
PluginsPath = "plugins_path"
DisabledPlugins = "plugins.disabled"
PluginsPath = "plugins_path"
PluginsSetting = "plugins.settings"
PluginsSettingPrefix = PluginsSetting + "."
DisabledPlugins = "plugins.disabled"
// i18n
Language = "language"
@@ -723,6 +725,53 @@ func (i *Instance) GetPluginsPath() string {
return i.getString(PluginsPath)
}
func (i *Instance) GetAllPluginConfiguration() map[string]interface{} {
i.RLock()
defer i.RUnlock()
ret := make(map[string]interface{})
sub := i.viper(PluginsSetting).GetStringMap(PluginsSetting)
if sub == nil {
return ret
}
for plugin := range sub {
// HACK: viper changes map keys to case insensitive values, so the workaround is to
// convert map keys to snake case for storage
name := fromSnakeCase(plugin)
ret[name] = fromSnakeCaseMap(i.viper(PluginsSetting).GetStringMap(PluginsSettingPrefix + plugin))
}
return ret
}
func (i *Instance) GetPluginConfiguration(pluginID string) map[string]interface{} {
i.RLock()
defer i.RUnlock()
key := PluginsSettingPrefix + toSnakeCase(pluginID)
// HACK: viper changes map keys to case insensitive values, so the workaround is to
// convert map keys to snake case for storage
v := i.viper(key).GetStringMap(key)
return fromSnakeCaseMap(v)
}
func (i *Instance) SetPluginConfiguration(pluginID string, v map[string]interface{}) {
i.RLock()
defer i.RUnlock()
pluginID = toSnakeCase(pluginID)
key := PluginsSettingPrefix + pluginID
// HACK: viper changes map keys to case insensitive values, so the workaround is to
// convert map keys to snake case for storage
i.viper(key).Set(key, toSnakeCaseMap(v))
}
func (i *Instance) GetDisabledPlugins() []string {
return i.getStringSlice(DisabledPlugins)
}