From 7bebdeebedfdb395f55ecbd90e26acf123d953a2 Mon Sep 17 00:00:00 2001 From: marcusDenslow Date: Sun, 26 Apr 2026 11:59:24 +0200 Subject: [PATCH] fix: fixed card and address list having duplicate items, and a checkout flow infinate loop condition --- api/handlers/addresses.go | 6 ++++++ api/handlers/cards.go | 7 +++++++ pkg/tui/confirmation.go | 3 ++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/api/handlers/addresses.go b/api/handlers/addresses.go index d34da77..20712e3 100644 --- a/api/handlers/addresses.go +++ b/api/handlers/addresses.go @@ -141,6 +141,12 @@ func (h *AddressHandler) CreateAddress(w http.ResponseWriter, r *http.Request) { return } + // remove existing addres with the same street addres + var existing models.Address + if err := db.Where("user_id = ? AND street = ?", userID, address.Street).First(&existing).Error; err == nil { + db.Delete(&existing) + } + if err := db.Create(&address).Error; err != nil { utils.RespondError(w, http.StatusInternalServerError, "DATABASE_ERROR", "failed to create address", nil) return diff --git a/api/handlers/cards.go b/api/handlers/cards.go index cca2905..5665af2 100644 --- a/api/handlers/cards.go +++ b/api/handlers/cards.go @@ -248,6 +248,13 @@ func (h *CardHandler) SaveCard(w http.ResponseWriter, r *http.Request) { return } + // remove existing local card with the same last4 + brand + expiry + var existingCard models.Card + if err := db.Where("user_id = ? AND last4 = ? AND brand = ? AND exp_month = ? AND exp_year = ?", + user.ID, pm.Card.Last4, string(pm.Card.Brand), pm.Card.ExpMonth, pm.Card.ExpYear).First(&existingCard).Error; err == nil { + db.Delete(&existingCard) + } + // Persist only the safe card metadata — no raw card data is stored. card := models.Card{ UserID: user.ID, diff --git a/pkg/tui/confirmation.go b/pkg/tui/confirmation.go index ddcd9f4..19fda26 100644 --- a/pkg/tui/confirmation.go +++ b/pkg/tui/confirmation.go @@ -187,8 +187,9 @@ func (m Model) ReviewUpdate(msg tea.Msg) (Model, tea.Cmd) { case CheckoutResultMsg: m.CheckingOut = false if msg.Err != nil { - m.ErrorMsg = fmt.Sprintf("checkout failed: %v", msg.Err) m = m.SwitchPage(paymentPage) + m.ErrorMsg = fmt.Sprintf("checkout failed: %v", msg.Err) + m.review.cardJustAdded = false m.payment.view = 0 m.payment.form = nil return m, nil