Refactor the processing of the campsite form in a common function

This commit is contained in:
jordi fita mas 2024-01-25 20:57:07 +01:00
parent ad161f57b2
commit 186a5fdb38
2 changed files with 22 additions and 34 deletions

View File

@ -134,46 +134,34 @@ func (page *campsiteIndex) MustRender(w http.ResponseWriter, r *http.Request, us
func addCampsite(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) { func addCampsite(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) {
f := newCampsiteForm(r.Context(), conn) f := newCampsiteForm(r.Context(), conn)
if err := f.Parse(r); err != nil { processCampsiteForm(w, r, user, company, conn, f, func(ctx context.Context, tx *database.Tx) error {
http.Error(w, err.Error(), http.StatusBadRequest) _, err := tx.AddCampsite(r.Context(), f.CampsiteType.String(), f.Label.Val)
return return err
} })
if err := user.VerifyCSRFToken(r); err != nil {
http.Error(w, err.Error(), http.StatusForbidden)
return
}
if !f.Valid(user.Locale) {
if !httplib.IsHTMxRequest(r) {
w.WriteHeader(http.StatusUnprocessableEntity)
}
f.MustRender(w, r, user, company)
return
}
if _, err := conn.AddCampsite(r.Context(), f.CampsiteType.String(), f.Label.Val); err != nil {
panic(err)
}
httplib.Redirect(w, r, "/admin/campsites", http.StatusSeeOther) httplib.Redirect(w, r, "/admin/campsites", http.StatusSeeOther)
} }
func editCampsite(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn, f *campsiteForm) { func editCampsite(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn, f *campsiteForm) {
if err := f.Parse(r); err != nil { processCampsiteForm(w, r, user, company, conn, f, func(ctx context.Context, tx *database.Tx) error {
http.Error(w, err.Error(), http.StatusBadRequest) return tx.EditCampsite(r.Context(), f.ID, f.CampsiteType.String(), f.Label.Val, f.Active.Checked)
})
httplib.Redirect(w, r, "/admin/campsites", http.StatusSeeOther)
}
func processCampsiteForm(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn, f *campsiteForm, act func(ctx context.Context, tx *database.Tx) error) {
if ok, err := form.Handle(f, w, r, user); err != nil {
return return
} } else if !ok {
if err := user.VerifyCSRFToken(r); err != nil {
http.Error(w, err.Error(), http.StatusForbidden)
return
}
if !f.Valid(user.Locale) {
if !httplib.IsHTMxRequest(r) {
w.WriteHeader(http.StatusUnprocessableEntity)
}
f.MustRender(w, r, user, company) f.MustRender(w, r, user, company)
return return
} }
if err := conn.EditCampsite(r.Context(), f.ID, f.CampsiteType.String(), f.Label.Val, f.Active.Checked); err != nil {
tx := conn.MustBegin(r.Context())
defer tx.Rollback(r.Context())
if err := act(r.Context(), tx); err != nil {
panic(err) panic(err)
} }
tx.MustCommit(r.Context())
httplib.Redirect(w, r, "/admin/campsites", http.StatusSeeOther) httplib.Redirect(w, r, "/admin/campsites", http.StatusSeeOther)
} }

View File

@ -11,12 +11,12 @@ import (
"golang.org/x/text/language" "golang.org/x/text/language"
) )
func (c *Conn) AddCampsite(ctx context.Context, typeSlug string, label string) (int, error) { func (tx *Tx) AddCampsite(ctx context.Context, typeSlug string, label string) (int, error) {
return c.GetInt(ctx, "select add_campsite($1, $2)", typeSlug, label) return tx.GetInt(ctx, "select add_campsite($1, $2)", typeSlug, label)
} }
func (c *Conn) EditCampsite(ctx context.Context, id int, typeSlug string, label string, active bool) error { func (tx *Tx) EditCampsite(ctx context.Context, id int, typeSlug string, label string, active bool) error {
_, err := c.Exec(ctx, "select edit_campsite($1, $2, $3, $4)", id, typeSlug, label, active) _, err := tx.Exec(ctx, "select edit_campsite($1, $2, $3, $4)", id, typeSlug, label, active)
return err return err
} }