fix: manage quantity && update geoloca

This commit is contained in:
2026-05-12 19:35:02 +02:00
parent 1319a4219a
commit 9a2f0d91ad
7 changed files with 815 additions and 42 deletions
+39 -13
View File
@@ -287,20 +287,46 @@ func (d *Database) GetBasketItemCount(username string) (int, error) {
return result.Count, nil
}
// UpdateBasketItemQuantity met à jour la quantité d'un item du panier
func (d *Database) UpdateBasketItemQuantity(basketID int, quantity float64) error {
if quantity <= 0 {
return fmt.Errorf("la quantité doit être supérieure à 0")
func (d *Database) UpdateBasketItemQuantity(basketID int, newQuantity float64) error {
if newQuantity <= 0 {
return fmt.Errorf("quantité invalide")
}
result := d.GDB.Exec(`UPDATE baskets SET quantity = ?, created_at = CURRENT_TIMESTAMP WHERE id = ?`,
quantity, basketID)
if result.Error != nil {
return fmt.Errorf("erreur lors de la mise à jour de la quantité: %w", result.Error)
}
if result.RowsAffected == 0 {
return fmt.Errorf("produit non trouvé dans le panier")
}
return nil
return d.GDB.Transaction(func(tx *gorm.DB) error {
var item struct {
ProductID int `gorm:"column:product_id"`
Quantity float64 `gorm:"column:quantity"`
}
if err := tx.Raw(`SELECT product_id, quantity FROM baskets WHERE id = ? FOR UPDATE`, basketID).Scan(&item).Error; err != nil {
return fmt.Errorf("produit non trouvé: %w", err)
}
if item.ProductID == 0 {
return fmt.Errorf("panier item introuvable: %d", basketID)
}
diff := newQuantity - item.Quantity
if diff > 0 {
result := tx.Exec(`UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?`,
diff, item.ProductID, diff)
if result.Error != nil {
return fmt.Errorf("erreur stock: %w", result.Error)
}
if result.RowsAffected == 0 {
return fmt.Errorf("stock insuffisant")
}
} else if diff < 0 {
if err := tx.Exec(`UPDATE products SET stock = stock + ? WHERE id = ?`,
-diff, item.ProductID).Error; err != nil {
return fmt.Errorf("erreur stock: %w", err)
}
}
if err := tx.Exec(`UPDATE baskets SET quantity = ? WHERE id = ?`,
newQuantity, basketID).Error; err != nil {
return fmt.Errorf("erreur panier: %w", err)
}
return nil
})
}
// ExtendBasketReservations prolonge les réservations