summaryrefslogtreecommitdiff
path: root/system/addon/manager.go
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-01-10 09:45:17 -0800
committerSteve Manuel <nilslice@gmail.com>2017-01-10 09:45:17 -0800
commit5e120ac4d5f6e8c53e5828df6640b20dc5862faa (patch)
treedd22241be556cc51eeb7aab2abdd60a1156034c4 /system/addon/manager.go
parentd5b31987a05df02cf4129e8603f2304b191e0834 (diff)
adding initial support for third-party addons and the basic framework for how they are registered by the system
Diffstat (limited to 'system/addon/manager.go')
-rw-r--r--system/addon/manager.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/system/addon/manager.go b/system/addon/manager.go
new file mode 100644
index 0000000..1be09c0
--- /dev/null
+++ b/system/addon/manager.go
@@ -0,0 +1,89 @@
+package addon
+
+import (
+ "bytes"
+ "fmt"
+ "html/template"
+ "net/url"
+
+ "encoding/json"
+
+ "github.com/ponzu-cms/ponzu/management/editor"
+)
+
+const defaultInput = `<input type="hidden" name="%s" value="%s"/>`
+
+const managerHTML = `
+<div class="card editor">
+ <form method="post" action="/admin/addon" enctype="multipart/form-data">
+ {{ .DefaultInputs }}
+ {{ .Editor }}
+ </form>
+</div>
+`
+
+type manager struct {
+ DefaultInputs template.HTML
+ Editor template.HTML
+}
+
+// Manage ...
+func Manage(data url.Values, reverseDNS string) ([]byte, error) {
+ a, ok := Types[reverseDNS]
+ if !ok {
+ return nil, fmt.Errorf("Addon has not been added to addon.Types map")
+ }
+
+ at := a()
+
+ // convert data => json => at{}
+ j, err := json.Marshal(data)
+ if err != nil {
+ return nil, err
+ }
+
+ err = json.Unmarshal(j, &at)
+ if err != nil {
+ return nil, err
+ }
+
+ e, ok := at.(editor.Editable)
+ if !ok {
+ return nil, fmt.Errorf("Addon is not editable - must implement editor.Editable: %T", at)
+ }
+
+ v, err := e.MarshalEditor()
+ if err != nil {
+ return nil, fmt.Errorf("Couldn't marshal editor for addon: %s", err.Error())
+ }
+
+ inputs := &bytes.Buffer{}
+ fields := []string{
+ "addon_name",
+ "addon_author",
+ "addon_author_url",
+ "addon_version",
+ "addon_reverse_dns",
+ "addon_status",
+ }
+
+ for _, f := range fields {
+ input := fmt.Sprintf(defaultInput, f, data.Get(f))
+ _, err := inputs.WriteString(input)
+ if err != nil {
+ return nil, fmt.Errorf("Failed to write input for addon view: %s", f)
+ }
+ }
+
+ m := manager{
+ DefaultInputs: template.HTML(inputs.Bytes()),
+ Editor: template.HTML(v),
+ }
+
+ // execute html template into buffer for func return val
+ buf := &bytes.Buffer{}
+ tmpl := template.Must(template.New("manager").Parse(managerHTML))
+ tmpl.Execute(buf, m)
+
+ return buf.Bytes(), nil
+}