diff options
-rw-r--r-- | system/addon/addon.go | 6 | ||||
-rw-r--r-- | system/admin/handlers.go | 93 | ||||
-rw-r--r-- | system/item/item.go | 7 |
3 files changed, 103 insertions, 3 deletions
diff --git a/system/addon/addon.go b/system/addon/addon.go index 5414d6f..dd3d00a 100644 --- a/system/addon/addon.go +++ b/system/addon/addon.go @@ -237,3 +237,9 @@ func reverseDNS(meta Meta) (string, error) { return strings.Join(append(strap, name), "."), nil } + +// String returns the addon name and overrides the item String() method in +// item.Identifiable interface +func (a *Addon) String() string { + return a.PonzuAddonName +} diff --git a/system/admin/handlers.go b/system/admin/handlers.go index bb36e39..286b0a7 100644 --- a/system/admin/handlers.go +++ b/system/admin/handlers.go @@ -2698,7 +2698,21 @@ func addonsHandler(res http.ResponseWriter, req *http.Request) { id := req.PostFormValue("id") action := strings.ToLower(req.PostFormValue("action")) - _, err = db.Addon(id) + at, ok := addon.Types[id] + if !ok { + log.Println("Error: no addon type found for:", id) + log.Println(err) + res.WriteHeader(http.StatusNotFound) + errView, err := Error404() + if err != nil { + return + } + + res.Write(errView) + return + } + + b, err := db.Addon(id) if err == db.ErrNoAddonExists { log.Println(err) res.WriteHeader(http.StatusNotFound) @@ -2722,9 +2736,55 @@ func addonsHandler(res http.ResponseWriter, req *http.Request) { return } + adn := at() + err = json.Unmarshal(b, adn) + if err != nil { + log.Println(err) + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + h, ok := adn.(item.Hookable) + if !ok { + log.Println("Addon", adn, "does not implement the item.Hookable interface or embed item.Item") + return + } + switch action { case "enable": - err := addon.Enable(id) + err := h.BeforeEnable(res, req) + if err != nil { + log.Println(err) + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + err = addon.Enable(id) + if err != nil { + log.Println(err) + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + err = h.AfterEnable(res, req) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) @@ -2736,8 +2796,35 @@ func addonsHandler(res http.ResponseWriter, req *http.Request) { res.Write(errView) return } + case "disable": - err := addon.Disable(id) + err := h.BeforeDisable(res, req) + if err != nil { + log.Println(err) + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + err = addon.Disable(id) + if err != nil { + log.Println(err) + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + err = h.AfterDisable(res, req) if err != nil { log.Println(err) res.WriteHeader(http.StatusInternalServerError) diff --git a/system/item/item.go b/system/item/item.go index caa6faa..961516a 100644 --- a/system/item/item.go +++ b/system/item/item.go @@ -67,6 +67,13 @@ type Hookable interface { BeforeReject(http.ResponseWriter, *http.Request) error AfterReject(http.ResponseWriter, *http.Request) error + + // Enable/Disable used for addons + BeforeEnable(http.ResponseWriter, *http.Request) error + AfterEnable(http.ResponseWriter, *http.Request) error + + BeforeDisable(http.ResponseWriter, *http.Request) error + AfterDisable(http.ResponseWriter, *http.Request) error } // Hideable lets a user keep items hidden |