From 7e2c1da95256fe62f605fa679bc128e58e3071e4 Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Thu, 14 Nov 2024 06:49:57 -0600 Subject: [PATCH] Editor page! --- editor.go | 138 +++++++++++++++++++++++++++++++++--------- embed/editor.html | 7 --- internal/blog/blog.go | 9 +-- main.go | 5 +- 4 files changed, 120 insertions(+), 39 deletions(-) delete mode 100644 embed/editor.html diff --git a/editor.go b/editor.go index f5fde34..f2a912d 100644 --- a/editor.go +++ b/editor.go @@ -1,29 +1,69 @@ package main import ( - "embed" + "bytes" "fmt" - "io" "log" "net/http" + "text/template" "time" "github.com/CalebQ42/darkstorm-server/internal/backend" + "github.com/CalebQ42/darkstorm-server/internal/blog" ) -//go:embed embed -var editorFS embed.FS +// //go:embed embed +// var editorFS embed.FS -const loginPage = ` +const ( + loginPage = `
- +
- -
+ +` + editorPage = ` +

+ + +

+

Select a blog!

` + editorForm = ` +
+ +

+ + + +

+ + + +

+ + +

+

` +) func loginPageRequest(w http.ResponseWriter, r *http.Request) { sendContent(w, r, loginPage, "", "") @@ -62,36 +102,80 @@ func trueLoginRequest(w http.ResponseWriter, r *http.Request) { } func editorRequest(w http.ResponseWriter, r *http.Request) { + if !verifyEditorCookie(r) { + editorRedirect(w, r, "/login") + return + } + tmpl, err := template.New("page").Parse(editorPage) + if err != nil { + log.Println("error parsing editor template:", err) + sendContent(w, r, "ERROR", "", "") + return + } + blogs, _ := blogApp.LatestBlogs(r.Context(), 0) + buf := new(bytes.Buffer) + err = tmpl.Execute(buf, blogs) + if err != nil { + log.Println("error executing editor page template:", err) + sendContent(w, r, "ERROR", "", "") + return + } + sendContent(w, r, buf.String(), "", "") +} + +func editorEdit(w http.ResponseWriter, r *http.Request) { + if !verifyEditorCookie(r) { + editorRedirect(w, r, "/login") + return + } + tmpl, err := template.New("editor").Parse(editorForm) + if err != nil { + log.Println("error parsing editor template:", err) + sendContent(w, r, "ERROR", "", "") + return + } + var bl *blog.Blog + blogID := r.URL.Query().Get("blog") + if blogID == "" { + sendContent(w, r, "

Select a blog!

", "", "") + return + } + if blogID == "new" { + bl = &blog.Blog{} + } else { + bl, err = blogApp.Blog(r.Context(), r.URL.Query().Get("blog")) + if err != nil { + log.Println("error getting blog for editor:", err) + sendContent(w, r, "ERROR", "", "") + return + } + } + buf := new(bytes.Buffer) + err = tmpl.Execute(buf, bl) + if err != nil { + log.Println("error executing editor template:", err) + sendContent(w, r, "ERROR", "", "") + return + } + sendContent(w, r, buf.String(), "", "") +} + +func verifyEditorCookie(r *http.Request) bool { authCookie, err := r.Cookie("blogAuthToken") if err != nil { if err != http.ErrNoCookie { log.Println("error getting auth cookie:", err) } - editorRedirect(w, r, "/login") - return + return false } - usr, err := back.VerifyUser(r.Context(), authCookie.Value) + _, err = back.VerifyUser(r.Context(), authCookie.Value) if err != nil { if err != backend.ErrTokenUnauthorized { log.Println("error authorizing JWT token:", err) } - editorRedirect(w, r, "/login") - return + return false } - page, err := editorFS.Open("embed/editor.html") - defer page.Close() - if err != nil { - log.Println("error getting editor.html:", err) - sendContent(w, r, "error getting page", "", "") - return - } - _, err = io.ReadAll(page) - if err != nil { - log.Println("error reading editor.html:", err) - sendContent(w, r, "error getting page", "", "") - return - } - sendContent(w, r, "

Hello there, "+usr.Username+"

", "", "") + return true } func editorRedirect(w http.ResponseWriter, r *http.Request, path string) { diff --git a/embed/editor.html b/embed/editor.html deleted file mode 100644 index 5cd4e6f..0000000 --- a/embed/editor.html +++ /dev/null @@ -1,7 +0,0 @@ -
-

- - - - -
diff --git a/internal/blog/blog.go b/internal/blog/blog.go index 6346558..214e102 100644 --- a/internal/blog/blog.go +++ b/internal/blog/blog.go @@ -28,7 +28,8 @@ type Blog struct { Author string `json:"author" bson:"author"` Favicon string `json:"favicon" bson:"favicon"` Title string `json:"title" bson:"title"` - Blog string `json:"blog" bson:"blog"` + RawBlog string `json:"blog" bson:"blog"` + HTMLBlog string `json:"-" bson:"-"` StaticPage bool `json:"staticPage" bson:"staticPage"` Draft bool `json:"draft" bson:"draft"` CreateTime int64 `json:"createTime" bson:"createTime"` @@ -37,7 +38,7 @@ type Blog struct { func (b *Blog) HTMX(blogApp *BlogApp, ctx context.Context) string { if b.StaticPage { - return b.Blog + return b.RawBlog } out := fmt.Sprintf(blogTitle, b.ID, b.ID, b.Title) auth, err := blogApp.GetAuthor(ctx, b) @@ -52,7 +53,7 @@ func (b *Blog) HTMX(blogApp *BlogApp, ctx context.Context) string { } else { out += fmt.Sprintf(blogCreate, cTime) } - out += fmt.Sprintf(blogMain, b.Blog) + out += fmt.Sprintf(blogMain, b.HTMLBlog) if err == nil { out += "

About the author:

" + auth.HTML() } @@ -61,7 +62,7 @@ func (b *Blog) HTMX(blogApp *BlogApp, ctx context.Context) string { func (b *BlogApp) ConvertBlog(blog *Blog) { if !blog.StaticPage { - blog.Blog = b.conv.HTMLConvert(blog.Blog) + blog.HTMLBlog = b.conv.HTMLConvert(blog.RawBlog) } } diff --git a/main.go b/main.go index d50509f..75d9916 100644 --- a/main.go +++ b/main.go @@ -147,13 +147,16 @@ func setupWebsite(mux *http.ServeMux) { url, _ := url.Parse("https://localhost:30000") mux.Handle("rpg.darkstorm.tech/", httputil.NewSingleHostReverseProxy(url)) } + mux.HandleFunc("/", mainHandle) mux.HandleFunc("GET /files/{w...}", filesRequest) mux.HandleFunc("GET /portfolio", portfolioRequest) mux.HandleFunc("GET /list", blogListHandle) + + // Editor stuff mux.HandleFunc("GET /login", loginPageRequest) mux.HandleFunc("GET /editor/", editorRequest) + mux.HandleFunc("GET /editor/edit", editorEdit) mux.HandleFunc("POST /login", trueLoginRequest) - mux.HandleFunc("/", mainHandle) } func mainHandle(w http.ResponseWriter, r *http.Request) {