From 51c33543e8154a9f02b0988d3ea99b0898179d1e Mon Sep 17 00:00:00 2001 From: Teajey <21069848+Teajey@users.noreply.github.com> Date: Wed, 8 May 2024 00:43:55 +1200 Subject: [PATCH] feat: multi-delete --- context/context.go | 12 ++--- context/home.go | 3 +- db/user.go | 89 ++++++++++++++++++++++++++----- templates/base.gotmpl | 12 ++++- templates/foreign_wishlist.gotmpl | 41 +++++++------- templates/home.gotmpl | 23 ++++---- 6 files changed, 126 insertions(+), 54 deletions(-) diff --git a/context/context.go b/context/context.go index a576f94..c45b2e8 100644 --- a/context/context.go +++ b/context/context.go @@ -32,15 +32,11 @@ func (ctx *Context) WishlistDelete(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) return } - target := r.Form.Get("gift_id") - if target == "" { - http.Error(w, "Gift ID not provided"+target, http.StatusBadRequest) - return - } - err := user.RemoveGift(target) + targets := r.Form["gift"] + err := user.RemoveGifts(targets...) if err != nil { - log.Printf("Failed to remove gift: %s\n", err) - http.Error(w, "Failed to remove gift.", http.StatusInternalServerError) + log.Printf("Failed to remove gifts: %s\n", err) + http.Error(w, "Failed to remove gifts.", http.StatusInternalServerError) return } http.Redirect(w, r, "/", http.StatusSeeOther) diff --git a/context/home.go b/context/home.go index f9c1101..399ebe1 100644 --- a/context/home.go +++ b/context/home.go @@ -8,6 +8,7 @@ import ( ) type HomeProps struct { + Username string Gifts []db.Gift Reference string } @@ -19,6 +20,6 @@ func (ctx *Context) Home(w http.ResponseWriter, r *http.Request) { http.Error(w, "An error occurred while fetching your wishlist :(", http.StatusInternalServerError) return } - p := HomeProps{Gifts: gifts, Reference: user.Reference} + p := HomeProps{Username: user.Name, Gifts: gifts, Reference: user.Reference} templates.Execute(w, "home.gotmpl", p) } diff --git a/db/user.go b/db/user.go index 06f7804..6a606d0 100644 --- a/db/user.go +++ b/db/user.go @@ -120,38 +120,84 @@ func (u *User) AddGift(name string) error { return nil } -func (u *User) RemoveGift(id string) error { +func (u *User) deleteGifts(tx *sql.Tx, ids []string) error { stmt := "DELETE FROM gift WHERE gift.creator_id = ? AND gift.id = ?" - result, err := database.Exec(stmt, u.Id, id) + for _, id := range ids { + r, err := tx.Exec(stmt, u.Id, id) + if err != nil { + return err + } + rE, err := r.RowsAffected() + if err != nil { + return err + } + if rE < 1 { + return fmt.Errorf("Gift deletion failed for '%s'", id) + } + } + return nil +} + +func (u *User) RemoveGifts(ids ...string) error { + if len(ids) < 1 { + return fmt.Errorf("Attempt to remove zero gifts") + } + + tx, err := database.Begin() if err != nil { return err } - affected, _ := result.RowsAffected() - if affected == 0 { - return fmt.Errorf("No gift match.") + + err = u.deleteGifts(tx, ids) + if err != nil { + rollBackErr := tx.Rollback() + if rollBackErr != nil { + return err + } + return err } - return nil + + err = tx.Commit() + return err } func (u *User) executeClaims(tx *sql.Tx, claims, unclaims []string) error { claimStmt := "UPDATE gift SET claimant_id = ? WHERE id = ?" unclaimStmt := "UPDATE gift SET claimant_id = NULL WHERE id = ?" for _, id := range claims { - _, err := tx.Exec(claimStmt, u.Id, id) + r, err := tx.Exec(claimStmt, u.Id, id) if err != nil { return err } - } - for _, id := range unclaims { - _, err := tx.Exec(unclaimStmt, id) + rE, err := r.RowsAffected() if err != nil { return err } + if rE < 1 { + return fmt.Errorf("Gift claim failed for '%s'", id) + } + } + for _, id := range unclaims { + r, err := tx.Exec(unclaimStmt, id) + if err != nil { + return err + } + rE, err := r.RowsAffected() + if err != nil { + return err + } + if rE < 1 { + return fmt.Errorf("Gift unclaim failed for '%s'", id) + } } return nil } func (u *User) ClaimGifts(claims, unclaims []string) error { + if len(claims) < 1 && len(unclaims) < 1 { + return fmt.Errorf("Attempt to claim/unclaim zero gifts") + } + tx, err := database.Begin() if err != nil { return err @@ -159,7 +205,10 @@ func (u *User) ClaimGifts(claims, unclaims []string) error { err = u.executeClaims(tx, claims, unclaims) if err != nil { - err = tx.Rollback() + rollBackErr := tx.Rollback() + if rollBackErr != nil { + return err + } return err } @@ -170,15 +219,26 @@ func (u *User) ClaimGifts(claims, unclaims []string) error { func (u *User) executeCompletions(tx *sql.Tx, claims []string) error { claimStmt := "UPDATE gift SET sent = 1 WHERE id = ?" for _, id := range claims { - _, err := tx.Exec(claimStmt, id) + r, err := tx.Exec(claimStmt, id) if err != nil { return err } + rE, err := r.RowsAffected() + if err != nil { + return err + } + if rE < 1 { + return fmt.Errorf("Gift completion failed for '%s'", id) + } } return nil } func (u *User) CompleteGifts(claims []string) error { + if len(claims) < 1 { + return fmt.Errorf("Attempt to complete zero gifts") + } + tx, err := database.Begin() if err != nil { return err @@ -186,7 +246,10 @@ func (u *User) CompleteGifts(claims []string) error { err = u.executeCompletions(tx, claims) if err != nil { - err = tx.Rollback() + rollBackErr := tx.Rollback() + if rollBackErr != nil { + return err + } return err } diff --git a/templates/base.gotmpl b/templates/base.gotmpl index 0a5642d..310de43 100644 --- a/templates/base.gotmpl +++ b/templates/base.gotmpl @@ -4,10 +4,18 @@