diff options
-rw-r--r-- | system/admin/handlers.go | 88 | ||||
-rw-r--r-- | system/api/external.go | 2 |
2 files changed, 89 insertions, 1 deletions
diff --git a/system/admin/handlers.go b/system/admin/handlers.go index 84f047c..e929ec9 100644 --- a/system/admin/handlers.go +++ b/system/admin/handlers.go @@ -20,6 +20,7 @@ import ( "github.com/bosssauce/ponzu/system/db" "github.com/nilslice/jwt" + "github.com/nilslice/ponzu-test/cmd/ponzu/vendor/github.com/gorilla/schema" ) func adminHandler(res http.ResponseWriter, req *http.Request) { @@ -787,7 +788,94 @@ func adminPostListItem(p editor.Editable, t, status string) []byte { } func approvePostHandler(res http.ResponseWriter, req *http.Request) { + if req.Method != http.MethodPost { + res.WriteHeader(http.StatusMethodNotAllowed) + errView, err := Error405() + if err != nil { + return + } + + res.Write(errView) + return + } + + err := req.ParseMultipartForm(1024 * 1024 * 4) // maxMemory 4MB + if err != nil { + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + t := req.FormValue("type") + if strings.Contains(t, "_") { + t = strings.Split(t, "_")[0] + } + + post := content.Types[t]() + + // check if we have a Mergeable + m, ok := post.(api.Mergeable) + if !ok { + res.WriteHeader(http.StatusBadRequest) + errView, err := Error400() + if err != nil { + return + } + + res.Write(errView) + return + } + + dec := schema.NewDecoder() + dec.IgnoreUnknownKeys(true) + dec.SetAliasTag("json") + err = dec.Decode(post, req.Form) + if err != nil { + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + // call its Approve method + err = m.Approve(req) + if err != nil { + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + + // Store the content in the bucket t + id, err = db.SetContent(t+":-1", req.Form) + if err != nil { + res.WriteHeader(http.StatusInternalServerError) + errView, err := Error500() + if err != nil { + return + } + + res.Write(errView) + return + } + // redirect to the new approved content's editor + redir := req.URL.Scheme + req.URL.Host + strings.TrimSuffix(req.URL.Path, "/approve") + redir += fmt.Sprintf("?type=%s&id=%d", t, id) + http.Redirect(res, req, http.StatusFound) } func editHandler(res http.ResponseWriter, req *http.Request) { diff --git a/system/api/external.go b/system/api/external.go index 4d52f48..4a42eb5 100644 --- a/system/api/external.go +++ b/system/api/external.go @@ -24,7 +24,7 @@ type Externalable interface { type Mergeable interface { // Approve copies an external post to the internal collection and triggers // a re-sort of its content type posts - Approve() error + Approve(req *http.Request) error } func externalPostsHandler(res http.ResponseWriter, req *http.Request) { |