diff options
Diffstat (limited to 'cmd/server/edit.go')
| -rw-r--r-- | cmd/server/edit.go | 168 |
1 files changed, 97 insertions, 71 deletions
diff --git a/cmd/server/edit.go b/cmd/server/edit.go index 694028b..10d109a 100644 --- a/cmd/server/edit.go +++ b/cmd/server/edit.go @@ -14,88 +14,114 @@ import ( "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) EditPage() http.Handler { + getFunc := a.GetEditPage().ServeHTTP + postFunc := a.SaveEditPage().ServeHTTP + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case "GET": + getFunc(w, r) + + return + case "POST": + postFunc(w, r) + + return + default: + a.Err500Default(w, r) + + return + } + }) } -func (a *App) SaveEditPage(w http.ResponseWriter, r *http.Request) { - if r.Method != "POST" { - a.Err500Default(w, r) +func (a *App) GetEditPage() http.Handler { + return http.HandlerFunc(func(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() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + a.Err500Default(w, r) - return - } + return + } - p := r.URL.Path - content := r.FormValue("content") + p := r.URL.Path + content := r.FormValue("content") - content = html.UnescapeString(content) - p = filepath.Clean(p) + content = html.UnescapeString(content) + p = filepath.Clean(p) - fn := "./" + p + page.Suffix + 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) + 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() + return + } + defer fh.Close() - c := bytes.ReplaceAll([]byte(content), []byte{'\r'}, []byte{}) + 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) + _, err = fh.Write(c) + if err != nil { + log.Printf("opening file %s for writing: %s", fn, err) + a.Err500Default(w, r) - return - } + return + } - http.Redirect(w, r, "/"+r.URL.Path, http.StatusFound) + 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) - } + err = a.ClearRedis() // Clear out the cache if any + if err != nil { + log.Printf("after editing %s: %s", fn, err) + } + }) } |
