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" }} +
{{ .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" }} +{{ .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) +}