diff --git a/editor.go b/editor.go index 9a19029..904b8df 100644 --- a/editor.go +++ b/editor.go @@ -2,7 +2,6 @@ package main import ( "context" - "encoding/json" "fmt" "io" "net/http" @@ -11,6 +10,7 @@ import ( "strings" "time" + "github.com/carlmjohnson/requests" "go.goblog.app/app/pkgs/bufferpool" "go.goblog.app/app/pkgs/contenttype" "go.goblog.app/app/pkgs/htmlbuilder" @@ -86,83 +86,71 @@ func (a *goBlog) createMarkdownPreview(w io.Writer, blog string, markdown io.Rea } func (a *goBlog) serveEditorPost(w http.ResponseWriter, r *http.Request) { - if action := r.FormValue("editoraction"); action != "" { - switch action { - case "loadupdate": - post, err := a.getPost(r.FormValue("path")) - if err != nil { - a.serveError(w, r, err.Error(), http.StatusBadRequest) - return - } - a.render(w, r, a.renderEditor, &renderData{ - Data: &editorRenderData{ - presetParams: parsePresetPostParamsFromQuery(r), - updatePostUrl: a.fullPostURL(post), - updatePostContent: a.postToMfItem(post).Properties.Content[0], - }, - }) - case "updatepost": - buf := bufferpool.Get() - defer bufferpool.Put(buf) - err := json.NewEncoder(buf).Encode(map[string]any{ - "action": actionUpdate, - "url": r.FormValue("url"), - "replace": map[string][]string{ - "content": { - r.FormValue("content"), - }, - }, - }) - if err != nil { - a.serveError(w, r, err.Error(), http.StatusInternalServerError) - return - } - req, err := http.NewRequestWithContext(r.Context(), http.MethodPost, "", buf) - if err != nil { - a.serveError(w, r, err.Error(), http.StatusInternalServerError) - return - } - req.Header.Set(contentType, contenttype.JSON) - a.editorMicropubPost(w, req, false) - case "upload": - a.editorMicropubPost(w, r, true) - case "tts": - parsedURL, err := url.Parse(r.FormValue("url")) - if err != nil { - a.serveError(w, r, err.Error(), http.StatusBadRequest) - return - } - post, err := a.getPost(parsedURL.Path) - if err != nil { - a.serveError(w, r, err.Error(), http.StatusBadRequest) - return - } - if err = a.createPostTTSAudio(post); err != nil { - a.serveError(w, r, err.Error(), http.StatusInternalServerError) - return - } - http.Redirect(w, r, post.Path, http.StatusFound) - case "helpgpx": - file, _, err := r.FormFile("file") - if err != nil { - a.serveError(w, r, err.Error(), http.StatusBadRequest) - return - } - gpx, err := io.ReadAll(a.min.Get().Reader(contenttype.XML, file)) - if err != nil { - a.serveError(w, r, err.Error(), http.StatusBadRequest) - return - } - w.Header().Set(contentType, contenttype.TextUTF8) - _ = yaml.NewEncoder(w).Encode(map[string]string{ - "gpx": string(gpx), - }) - default: - a.serveError(w, r, "Unknown editoraction", http.StatusBadRequest) + switch action := r.FormValue("editoraction"); action { + case "loadupdate": + post, err := a.getPost(r.FormValue("path")) + if err != nil { + a.serveError(w, r, err.Error(), http.StatusBadRequest) + return } - return + a.render(w, r, a.renderEditor, &renderData{ + Data: &editorRenderData{ + presetParams: parsePresetPostParamsFromQuery(r), + updatePostUrl: a.fullPostURL(post), + updatePostContent: a.postToMfItem(post).Properties.Content[0], + }, + }) + case "createpost", "updatepost": + reqBody := map[string]any{} + if action == "updatepost" { + reqBody["action"] = actionUpdate + reqBody["url"] = r.FormValue("url") + reqBody["replace"] = map[string][]string{"content": {r.FormValue("content")}} + } else { + reqBody["type"] = []string{"h-entry"} + reqBody["properties"] = map[string][]string{"content": {r.FormValue("content")}} + } + req, _ := requests.URL("").BodyJSON(reqBody).Request(r.Context()) + a.editorMicropubPost(w, req, false) + case "upload": + a.editorMicropubPost(w, r, true) + case "delete", "undelete": + req, _ := requests.URL("").Method(http.MethodPost).ContentType(contenttype.WWWForm).Param("action", action).Param("url", r.FormValue("url")).Request(r.Context()) + a.editorMicropubPost(w, req, false) + case "tts": + parsedURL, err := url.Parse(r.FormValue("url")) + if err != nil { + a.serveError(w, r, err.Error(), http.StatusBadRequest) + return + } + post, err := a.getPost(parsedURL.Path) + if err != nil { + a.serveError(w, r, err.Error(), http.StatusBadRequest) + return + } + if err = a.createPostTTSAudio(post); err != nil { + a.serveError(w, r, err.Error(), http.StatusInternalServerError) + return + } + http.Redirect(w, r, post.Path, http.StatusFound) + case "helpgpx": + file, _, err := r.FormFile("file") + if err != nil { + a.serveError(w, r, err.Error(), http.StatusBadRequest) + return + } + gpx, err := io.ReadAll(a.min.Get().Reader(contenttype.XML, file)) + if err != nil { + a.serveError(w, r, err.Error(), http.StatusBadRequest) + return + } + w.Header().Set(contentType, contenttype.TextUTF8) + _ = yaml.NewEncoder(w).Encode(map[string]string{ + "gpx": string(gpx), + }) + default: + a.serveError(w, r, "Unknown or missing editoraction", http.StatusBadRequest) } - a.editorMicropubPost(w, r, false) } func (a *goBlog) editorMicropubPost(w http.ResponseWriter, r *http.Request, media bool) { diff --git a/go.mod b/go.mod index bd3cc0e..5182efe 100644 --- a/go.mod +++ b/go.mod @@ -108,8 +108,8 @@ require ( github.com/pelletier/go-toml/v2 v2.0.7 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rs/xid v1.4.0 // indirect - github.com/rs/zerolog v1.29.0 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/rs/zerolog v1.29.1 // indirect github.com/snabb/diagio v1.0.4 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect diff --git a/go.sum b/go.sum index 939b370..6dbf284 100644 --- a/go.sum +++ b/go.sum @@ -81,7 +81,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cretz/bine v0.2.1-0.20221201125941-b9d31d9c7866 h1:8Cji9JDEuYibvDQrWHvc42r9/HxjlD2kahN67LECXFk= github.com/cretz/bine v0.2.1-0.20221201125941-b9d31d9c7866/go.mod h1:WU4o9QR9wWp8AVKtTM1XD5vUHkEqnf2vVSo6dBqbetI= @@ -350,10 +350,11 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= -github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA= diff --git a/ui.go b/ui.go index db3d515..3e8a5b4 100644 --- a/ui.go +++ b/ui.go @@ -915,14 +915,14 @@ func (a *goBlog) renderPost(hb *htmlbuilder.HtmlBuilder, rd *renderData) { hb.WriteElementClose("form") // Delete hb.WriteElementOpen("form", "method", "post", "action", rd.Blog.getRelativePath("/editor")) - hb.WriteElementOpen("input", "type", "hidden", "name", "action", "value", "delete") + hb.WriteElementOpen("input", "type", "hidden", "name", "editoraction", "value", "delete") hb.WriteElementOpen("input", "type", "hidden", "name", "url", "value", rd.Canonical) hb.WriteElementOpen("input", "type", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "delete"), "class", "confirm", "data-confirmmessage", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "confirmdelete")) hb.WriteElementClose("form") // Undelete if p.Deleted() { hb.WriteElementOpen("form", "method", "post", "action", rd.Blog.getRelativePath("/editor")) - hb.WriteElementOpen("input", "type", "hidden", "name", "action", "value", "undelete") + hb.WriteElementOpen("input", "type", "hidden", "name", "editoraction", "value", "undelete") hb.WriteElementOpen("input", "type", "hidden", "name", "url", "value", rd.Canonical) hb.WriteElementOpen("input", "type", "submit", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "undelete")) hb.WriteElementClose("form") @@ -1356,7 +1356,7 @@ func (a *goBlog) renderEditor(hb *htmlbuilder.HtmlBuilder, rd *renderData) { hb.WriteElementClose("h2") _ = a.renderMarkdownToWriter(hb, a.editorPostDesc(rd.Blog), false) hb.WriteElementOpen("form", "method", "post", "class", "fw p") - hb.WriteElementOpen("input", "type", "hidden", "name", "h", "value", "entry") + hb.WriteElementOpen("input", "type", "hidden", "name", "editoraction", "value", "createpost") hb.WriteElementOpen( "input", "id", "templatebtn", "type", "button", "value", a.ts.GetTemplateStringVariant(rd.Blog.Lang, "editorusetemplate"),