From a5b7f045d672213b13eb0437aa6db7011de91fba Mon Sep 17 00:00:00 2001 From: m15o Date: Mon, 22 Nov 2021 14:23:30 +0100 Subject: [PATCH] edit status --- web/handler/handler.go | 2 ++ web/handler/html.go | 15 +++++++++ web/handler/html/edit_status.html | 15 +++++++++ web/handler/status_edit.go | 52 +++++++++++++++++++++++++++++++ web/handler/status_update.go | 46 +++++++++++++++++++++++++++ 5 files changed, 130 insertions(+) create mode 100644 web/handler/html/edit_status.html create mode 100644 web/handler/status_edit.go create mode 100644 web/handler/status_update.go diff --git a/web/handler/handler.go b/web/handler/handler.go index e678e5a..b101438 100644 --- a/web/handler/handler.go +++ b/web/handler/handler.go @@ -73,6 +73,8 @@ func New(cfg *config.Config, sess *session.Session, data *storage.Storage) (http router.HandleFunc("/statuses/new", h.showNewStatusView).Methods(http.MethodGet) router.HandleFunc("/statuses/save", h.saveStatus).Methods(http.MethodPost) + router.HandleFunc("/statuses/{id}/edit", h.showEditStatusView).Methods(http.MethodGet) + router.HandleFunc("/statuses/{id}/update", h.updateStatus).Methods(http.MethodPost) return router, nil } diff --git a/web/handler/html.go b/web/handler/html.go index 371815f..d8275f8 100644 --- a/web/handler/html.go +++ b/web/handler/html.go @@ -17,6 +17,21 @@ var TplMap = map[string]string{ +{{ end }}`, + "edit_status": `{{ define "content" }} +

Edit status

+{{ if .form.Error }} +

{{ .form.Error }}

+{{ end }} +{{ if .flash }} +

{{ .flash }}

+{{ end }} +
+
+ +
+ +
{{ end }}`, "index": `{{ define "content" }}

This is the index

diff --git a/web/handler/html/edit_status.html b/web/handler/html/edit_status.html new file mode 100644 index 0000000..cb5ea9c --- /dev/null +++ b/web/handler/html/edit_status.html @@ -0,0 +1,15 @@ +{{ define "content" }} +

Edit status

+{{ if .form.Error }} +

{{ .form.Error }}

+{{ end }} +{{ if .flash }} +

{{ .flash }}

+{{ end }} +
+
+ +
+ +
+{{ end }} \ No newline at end of file diff --git a/web/handler/status_edit.go b/web/handler/status_edit.go new file mode 100644 index 0000000..f09f930 --- /dev/null +++ b/web/handler/status_edit.go @@ -0,0 +1,52 @@ +package handler + +import ( + "github.com/gorilla/mux" + "net/http" + "strconv" +) + +func RouteInt64Param(r *http.Request, param string) int64 { + vars := mux.Vars(r) + value, err := strconv.ParseInt(vars[param], 10, 64) + if err != nil { + return 0 + } + + if value < 0 { + return 0 + } + + return value +} + +func (h *Handler) showEditStatusView(w http.ResponseWriter, r *http.Request) { + user, err := h.getUser(r) + if err != nil { + unauthorized(w) + return + } + status, err := h.storage.StatusById(RouteInt64Param(r, "id")) + if err != nil { + serverError(w, err) + return + } + if user != status.User { + unauthorized(w) + return + } + session, err := h.sess.Store.Get(r, "ichi") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + flash := "" + if flashes := session.Flashes(); len(flashes) > 0 { + flash = flashes[0].(string) + } + session.Save(r, w) + h.renderLayout(w, "edit_status", map[string]interface{}{ + "status": status, + "flash": flash, + }, user) +} diff --git a/web/handler/status_update.go b/web/handler/status_update.go new file mode 100644 index 0000000..72a498e --- /dev/null +++ b/web/handler/status_update.go @@ -0,0 +1,46 @@ +package handler + +import ( + "fmt" + "net/http" + "status/web/handler/form" +) + +func (h *Handler) updateStatus(w http.ResponseWriter, r *http.Request) { + user, err := h.getUser(r) + if err != nil { + unauthorized(w) + return + } + status, err := h.storage.StatusById(RouteInt64Param(r, "id")) + if err != nil { + serverError(w, err) + return + } + + if user != status.User { + unauthorized(w) + return + } + f := form.NewStatusForm(r) + status.Content = f.Content + if err := status.Validate(); err != nil { + f.Error = err.Error() + h.renderLayout(w, "edit_post", map[string]interface{}{ + "form": f, + }, "") + return + } + if err := h.storage.UpdateStatus(status); err != nil { + serverError(w, err) + return + } + session, err := h.sess.Store.Get(r, "ichi") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + session.AddFlash("Status edited!") + err = session.Save(r, w) + http.Redirect(w, r, fmt.Sprintf("/statuses/%d/edit", status.Id), http.StatusFound) +}