edit status

This commit is contained in:
m15o 2021-11-22 14:23:30 +01:00
parent db62fa1bf7
commit a5b7f045d6
5 changed files with 130 additions and 0 deletions

View file

@ -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/new", h.showNewStatusView).Methods(http.MethodGet)
router.HandleFunc("/statuses/save", h.saveStatus).Methods(http.MethodPost) 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 return router, nil
} }

View file

@ -17,6 +17,21 @@ var TplMap = map[string]string{
</div> </div>
<input type="submit" value="Submit"> <input type="submit" value="Submit">
</form> </form>
{{ end }}`,
"edit_status": `{{ define "content" }}
<h1>Edit status</h1>
{{ if .form.Error }}
<p>{{ .form.Error }}</p>
{{ end }}
{{ if .flash }}
<p>{{ .flash }}</p>
{{ end }}
<form action="/statuses/{{ .status.Id }}/update" method="post">
<div class="field">
<input type="text" name="content" placeholder="What's new?" required autofocus value="{{ .status.Content }}"/>
</div>
<input type="submit" value="Submit">
</form>
{{ end }}`, {{ end }}`,
"index": `{{ define "content" }} "index": `{{ define "content" }}
<p>This is the index</p> <p>This is the index</p>

View file

@ -0,0 +1,15 @@
{{ define "content" }}
<h1>Edit status</h1>
{{ if .form.Error }}
<p>{{ .form.Error }}</p>
{{ end }}
{{ if .flash }}
<p>{{ .flash }}</p>
{{ end }}
<form action="/statuses/{{ .status.Id }}/update" method="post">
<div class="field">
<input type="text" name="content" placeholder="What's new?" required autofocus value="{{ .status.Content }}"/>
</div>
<input type="submit" value="Submit">
</form>
{{ end }}

View file

@ -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)
}

View file

@ -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)
}