diff options
author | Steve Manuel <nilslice@gmail.com> | 2017-04-29 23:01:51 -0500 |
---|---|---|
committer | Steve Manuel <nilslice@gmail.com> | 2017-04-29 23:01:51 -0500 |
commit | 8a1d091a0c6d55dbd6c713b2240bee8550541e7b (patch) | |
tree | 8ebe1e3f0780f66530b723ce9b48f69ae664d764 | |
parent | 3c8c848606b996e2c7a06331401e622f888b84c5 (diff) |
add delete procedure and implementation for uploads
-rw-r--r-- | system/admin/handlers.go | 64 | ||||
-rw-r--r-- | system/admin/server.go | 1 | ||||
-rw-r--r-- | system/db/upload.go | 22 |
3 files changed, 87 insertions, 0 deletions
diff --git a/system/admin/handlers.go b/system/admin/handlers.go index ac18020..bb36e39 100644 --- a/system/admin/handlers.go +++ b/system/admin/handlers.go @@ -2061,6 +2061,70 @@ func deleteHandler(res http.ResponseWriter, req *http.Request) { http.Redirect(res, req, redir, http.StatusFound) } +func deleteUploadHandler(res http.ResponseWriter, req *http.Request) { + if req.Method != http.MethodPost { + res.WriteHeader(http.StatusMethodNotAllowed) + return + } + + err := req.ParseMultipartForm(1024 * 1024 * 4) // maxMemory 4MB + if err != nil { + log.Println(err) + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + id := req.FormValue("id") + t := "__uploads" + + if id == "" || t == "" { + res.WriteHeader(http.StatusBadRequest) + return + } + + post := interface{}(&item.FileUpload{}) + hook, ok := post.(item.Hookable) + if !ok { + log.Println("Type", t, "does not implement item.Hookable or embed item.Item.") + res.WriteHeader(http.StatusBadRequest) + errView, err := Error400() + if err != nil { + return + } + + res.Write(errView) + return + } + + err = hook.BeforeDelete(res, req) + if err != nil { + log.Println("Error running BeforeDelete method in deleteHandler for:", t, err) + return + } + + err = db.DeleteUpload(t + ":" + id) + if err != nil { + log.Println(err) + res.WriteHeader(http.StatusInternalServerError) + return + } + + err = hook.AfterDelete(res, req) + if err != nil { + log.Println("Error running AfterDelete method in deleteHandler for:", t, err) + return + } + + redir := "/admin/uploads" + http.Redirect(res, req, redir, http.StatusFound) +} + func editUploadHandler(res http.ResponseWriter, req *http.Request) { switch req.Method { case http.MethodGet: diff --git a/system/admin/server.go b/system/admin/server.go index b029be4..2180441 100644 --- a/system/admin/server.go +++ b/system/admin/server.go @@ -42,6 +42,7 @@ func Run() { http.HandleFunc("/admin/edit/delete", user.Auth(deleteHandler)) http.HandleFunc("/admin/edit/approve", user.Auth(approveContentHandler)) http.HandleFunc("/admin/edit/upload", user.Auth(editUploadHandler)) + http.HandleFunc("/admin/edit/upload/delete", user.Auth(deleteUploadHandler)) pwd, err := os.Getwd() if err != nil { diff --git a/system/db/upload.go b/system/db/upload.go index 956b7f9..beeee2d 100644 --- a/system/db/upload.go +++ b/system/db/upload.go @@ -201,6 +201,28 @@ func UploadAll() [][]byte { return uploads } +// DeleteUpload removes the value for an upload at its key id, based on the +// target provided i.e. __uploads:{id} +func DeleteUpload(target string) error { + parts := strings.Split(target, ":") + if len(parts) < 2 { + return fmt.Errorf("Error deleting upload, invalid target %s", target) + } + id, err := key(parts[1]) + if err != nil { + return err + } + + return store.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(parts[0])) + if b == nil { + return bolt.ErrBucketNotFound + } + + return b.Delete(id) + }) +} + func key(sid string) ([]byte, error) { id, err := strconv.Atoi(sid) if err != nil { |