Editor page!

This commit is contained in:
Caleb Gardner
2024-11-14 06:49:57 -06:00
parent 54f7f1b1fa
commit 7e2c1da952
4 changed files with 120 additions and 39 deletions
+111 -27
View File
@@ -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 = `
<form id="loginForm" hx-post="/login" hx-target="#formResult">
<label for="username">Username:</label>
<input name="username" id="usernameInput" onkeydown="return event.key != 'Enter';"></input>
<input name="username" id="usernameInput" onkeydown="return event.key != 'Enter';" type="text"></input>
<label for="password">Password:</label>
<input name="password" type="password" id="passwordInput"></input>
<div id="formResult"></div>
<button id="loginButton" type="submit">Login</button>
</form>
<button class="formButton" type="submit">Login</button>
</form>`
editorPage = `
<p>
<label for="blog" style="margin-right:10px">Blog:</label>
<select id="blogSelect"
name='blog'
hx-get='/editor/edit'
hx-target='#editor'>
<option value=""></option>
<option value='new'>New Blog</option>
{{ range $blog := . }}
<option value='{{$blog.ID}}'>{{$blog.Title}}</option>
{{end}}
</select>
</p>
<div id="editor" hx-on::after-swap="blogEditorResize()"><p>Select a blog!</p></div>
`
editorForm = `
<form id="editorForm" hx-post="/editor/post">
<input name="id" type="hidden" value="{{.ID}}"></input>
<p>
<label for="static" style="margin-right:10px">Static Page:</label><input type="checkbox" name="static"{{if .StaticPage}} checked {{end}}/>
<span class="vertical-seperator"></span>
<label for="draft" style="margin-right:10px">Draft:</label><input type="checkbox" name="draft"{{if .Draft}} checked {{end}}/>
</p>
<label for="title">Title</label>
<input id="titleInput" name="title" value="{{.Title}}" type="text"/>
<textarea id="blogEditor" name="blog" oninput="blogEditorResize()">{{.RawBlog}}</textarea>
<p style="margin-right:0px;">
<button class="formButton" type="submit" style="margin-right:0px;">{{if eq .ID ""}}Create{{else}}Update{{end}}</button>
<button class="formButton" type="submit" style="margin-right:0px;"
hx-get="/editor/edit"
hx-include="#blogSelect"
hx-target="#editor"
hx-confirm="Undo all your changes??">
Cancel
</button>
<p>
</form>`
)
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, "<p>Select a blog!</p>", "", "")
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, "<p>Hello there, "+usr.Username+"</p>", "", "")
return true
}
func editorRedirect(w http.ResponseWriter, r *http.Request, path string) {