summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-04-29 23:01:51 -0500
committerSteve Manuel <nilslice@gmail.com>2017-04-29 23:01:51 -0500
commit8a1d091a0c6d55dbd6c713b2240bee8550541e7b (patch)
tree8ebe1e3f0780f66530b723ce9b48f69ae664d764
parent3c8c848606b996e2c7a06331401e622f888b84c5 (diff)
add delete procedure and implementation for uploads
-rw-r--r--system/admin/handlers.go64
-rw-r--r--system/admin/server.go1
-rw-r--r--system/db/upload.go22
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 {