diff options
author | Steve Manuel <nilslice@gmail.com> | 2017-01-11 16:00:03 -0800 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2017-01-11 16:00:03 -0800 |
commit | 270e04f2333a9c0993fcee864bac9fbc2288cdb7 (patch) | |
tree | e3c54763e576f48591a4c9b125c227d06c2122db /system/addon/manager.go | |
parent | aec6cd4045a49c3aa5b0f8194658726c61b75094 (diff) |
adding []byte driven api vs. url.Values where ever possible
Diffstat (limited to 'system/addon/manager.go')
-rw-r--r-- | system/addon/manager.go | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/system/addon/manager.go b/system/addon/manager.go index acd779a..eb8b44c 100644 --- a/system/addon/manager.go +++ b/system/addon/manager.go @@ -2,12 +2,14 @@ package addon import ( "bytes" + "encoding/json" "fmt" "html/template" "net/url" "github.com/gorilla/schema" "github.com/ponzu-cms/ponzu/management/editor" + "github.com/tidwall/gjson" ) const defaultInput = `<input type="hidden" name="%s" value="%s"/>` @@ -31,18 +33,42 @@ type manager struct { } // Manage ... -func Manage(data url.Values, reverseDNS string) ([]byte, error) { +func Manage(data []byte, reverseDNS string) ([]byte, error) { a, ok := Types[reverseDNS] if !ok { return nil, fmt.Errorf("Addon has not been added to addon.Types map") } + // convert json => map[string]interface{} => url.Values + var kv map[string]interface{} + err := json.Unmarshal(data, kv) + if err != nil { + return nil, err + } + + var vals url.Values + for k, v := range kv { + switch v.(type) { + case []string: + s := v.([]string) + for i := range s { + if i == 0 { + vals.Set(k, s[i]) + } + + vals.Add(k, s[i]) + } + default: + vals.Set(k, fmt.Sprintf("%v", v)) + } + } + at := a() dec := schema.NewDecoder() dec.IgnoreUnknownKeys(true) dec.SetAliasTag("json") - err := dec.Decode(at, data) + err = dec.Decode(at, vals) if err != nil { return nil, err } @@ -68,7 +94,7 @@ func Manage(data url.Values, reverseDNS string) ([]byte, error) { } for _, f := range fields { - input := fmt.Sprintf(defaultInput, f, data.Get(f)) + input := fmt.Sprintf(defaultInput, f, gjson.GetBytes(data, f).String()) _, err := inputs.WriteString(input) if err != nil { return nil, fmt.Errorf("Failed to write input for addon view: %s", f) @@ -78,7 +104,7 @@ func Manage(data url.Values, reverseDNS string) ([]byte, error) { m := manager{ DefaultInputs: template.HTML(inputs.Bytes()), Editor: template.HTML(v), - AddonName: data.Get("addon_name"), + AddonName: gjson.GetBytes(data, "addon_name").String(), } // execute html template into buffer for func return val |