chore: fix vulenrability

This commit is contained in:
2026-03-12 21:59:18 +01:00
parent f5902665ec
commit 9cb50bb625
12 changed files with 146 additions and 153 deletions
+47 -14
View File
@@ -270,35 +270,68 @@ func (d *Database) DecrementProductStockByID(productID int, quantity float64) er
return nil
}
// DeleteProductFromBasket supprime un produit spécifique du panier
// DeleteProductFromBasket supprime un produit spécifique du panier et restitue le stock.
func (d *Database) DeleteProductFromBasket(basketID int) error {
query := `DELETE FROM baskets WHERE id = $1`
result, err := d.Exec(query, basketID)
tx, err := d.Begin()
if err != nil {
return fmt.Errorf("erreur lors de la suppression du produit: %w", err)
return fmt.Errorf("erreur transaction: %w", err)
}
defer tx.Rollback()
rowsAffected, err := result.RowsAffected()
var productID int
var quantity float64
err = tx.QueryRow(
`SELECT product_id, quantity FROM baskets WHERE id = $1`,
basketID,
).Scan(&productID, &quantity)
if err != nil {
return fmt.Errorf("erreur lors de la vérification des lignes affectées: %w", err)
}
if rowsAffected == 0 {
return fmt.Errorf("produit non trouvé dans le panier")
}
return nil
_, err = tx.Exec(
`UPDATE products SET stock = stock + $1 WHERE id = $2`,
quantity, productID,
)
if err != nil {
return fmt.Errorf("erreur restitution stock: %w", err)
}
result, err := tx.Exec(`DELETE FROM baskets WHERE id = $1`, basketID)
if err != nil {
return fmt.Errorf("erreur lors de la suppression du produit: %w", err)
}
rows, _ := result.RowsAffected()
if rows == 0 {
return fmt.Errorf("produit non trouvé dans le panier")
}
return tx.Commit()
}
// ClearBasket vide complètement le panier d'un utilisateur
// ClearBasket vide complètement le panier d'un utilisateur et restitue les stocks.
func (d *Database) ClearBasket(username string) error {
query := `DELETE FROM baskets WHERE username = $1`
_, err := d.Exec(query, username)
tx, err := d.Begin()
if err != nil {
return fmt.Errorf("erreur transaction: %w", err)
}
defer tx.Rollback()
_, err = tx.Exec(`
UPDATE products p
SET stock = stock + b.quantity
FROM baskets b
WHERE b.username = $1 AND b.product_id = p.id
`, username)
if err != nil {
return fmt.Errorf("erreur restitution stock: %w", err)
}
_, err = tx.Exec(`DELETE FROM baskets WHERE username = $1`, username)
if err != nil {
return fmt.Errorf("erreur lors du vidage du panier: %w", err)
}
return nil
return tx.Commit()
}
// GetBasketTotal calcule le montant total du panier d'un utilisateur