mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-21 23:22:34 +01:00
fix(shop): resolve ambiguous column and missing unique constraint in RecordPurchase
The ON CONFLICT upsert referenced unqualified "bought" which PostgreSQL rejected as ambiguous, and the table lacked the UNIQUE constraint needed for ON CONFLICT. Adds a unique index on (character_id, shop_item_id) via migration 0003 and qualifies the column as shop_items_bought.bought.
This commit is contained in:
@@ -28,8 +28,7 @@ func (r *ShopRepository) GetShopItems(shopType uint8, shopID uint32, charID uint
|
||||
func (r *ShopRepository) RecordPurchase(charID, shopItemID, quantity uint32) error {
|
||||
_, err := r.db.Exec(`INSERT INTO shop_items_bought (character_id, shop_item_id, bought)
|
||||
VALUES ($1,$2,$3) ON CONFLICT (character_id, shop_item_id)
|
||||
DO UPDATE SET bought = bought + $3
|
||||
WHERE EXCLUDED.character_id=$1 AND EXCLUDED.shop_item_id=$2
|
||||
DO UPDATE SET bought = shop_items_bought.bought + $3
|
||||
`, charID, shopItemID, quantity)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -57,14 +57,32 @@ func TestRepoShopGetShopItems(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRepoShopRecordPurchaseAmbiguousColumn(t *testing.T) {
|
||||
repo, _, charID := setupShopRepo(t)
|
||||
func TestRepoShopRecordPurchaseInsertAndUpdate(t *testing.T) {
|
||||
repo, db, charID := setupShopRepo(t)
|
||||
|
||||
// RecordPurchase uses ON CONFLICT with unqualified "bought" column reference,
|
||||
// which PostgreSQL rejects as ambiguous. This test documents the existing bug.
|
||||
err := repo.RecordPurchase(charID, 1, 3)
|
||||
if err == nil {
|
||||
t.Fatal("Expected error from ambiguous column reference in RecordPurchase SQL, but got nil")
|
||||
// First purchase inserts a new row
|
||||
if err := repo.RecordPurchase(charID, 1, 3); err != nil {
|
||||
t.Fatalf("RecordPurchase (insert) failed: %v", err)
|
||||
}
|
||||
|
||||
var bought int
|
||||
if err := db.QueryRow("SELECT bought FROM shop_items_bought WHERE character_id=$1 AND shop_item_id=$2", charID, 1).Scan(&bought); err != nil {
|
||||
t.Fatalf("Verification query failed: %v", err)
|
||||
}
|
||||
if bought != 3 {
|
||||
t.Errorf("Expected bought=3, got: %d", bought)
|
||||
}
|
||||
|
||||
// Second purchase updates (adds to) the existing row
|
||||
if err := repo.RecordPurchase(charID, 1, 2); err != nil {
|
||||
t.Fatalf("RecordPurchase (update) failed: %v", err)
|
||||
}
|
||||
|
||||
if err := db.QueryRow("SELECT bought FROM shop_items_bought WHERE character_id=$1 AND shop_item_id=$2", charID, 1).Scan(&bought); err != nil {
|
||||
t.Fatalf("Verification query failed: %v", err)
|
||||
}
|
||||
if bought != 5 {
|
||||
t.Errorf("Expected bought=5 (3+2), got: %d", bought)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user