package main import ( "bytes" "errors" "html" "io" "io/fs" "log" "net/http" "os" "path/filepath" "riedstra.dev/mitch/go-website/page" ) func (a *App) EditPage(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { page.Render(w, r, page.TemplateDirectory+"/4xx", map[string]interface{}{ "Title": "Method Not allowed", "Description": "Method not allowed", "LoggedIn": a.IsLoggedIn(r), }, http.StatusMethodNotAllowed) return } p := r.URL.Path p = filepath.Clean(p) fh, err := os.Open("./" + p + page.Suffix) if err != nil && errors.Is(err, fs.ErrNotExist) { fh, err = os.Open("./" + page.TemplateDirectory + "/new-template" + page.Suffix) } if err != nil { log.Printf("opening page: %s", err) a.Err500Default(w, r) return } defer fh.Close() b, err := io.ReadAll(fh) if err != nil { log.Printf("opening page: %s", err) a.Err500Default(w, r) return } page.Render(w, r, page.TemplateDirectory+"/edit", map[string]interface{}{ "Page": p, "Content": html.EscapeString(string(b)), "LoggedIn": a.IsLoggedIn(r), }, http.StatusOK) } func (a *App) SaveEditPage(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { a.Err500Default(w, r) return } p := r.URL.Path content := r.FormValue("content") content = html.UnescapeString(content) p = filepath.Clean(p) fn := "./" + p + page.Suffix fh, err := os.OpenFile(fn, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { log.Printf("opening file %s for writing: %s", fn, err) a.Err500Default(w, r) return } defer fh.Close() c := bytes.ReplaceAll([]byte(content), []byte{'\r'}, []byte{}) _, err = fh.Write(c) if err != nil { log.Printf("opening file %s for writing: %s", fn, err) a.Err500Default(w, r) return } http.Redirect(w, r, "/"+r.URL.Path, http.StatusFound) err = a.ClearRedis() // Clear out the cache if any if err != nil { log.Printf("after editing %s: %s", fn, err) } }