chore: build

This commit is contained in:
2026-06-14 15:17:44 +02:00
parent 8a503b544e
commit 2cd7f38908
3 changed files with 47 additions and 31 deletions
+21 -12
View File
@@ -43,29 +43,38 @@ func (d *Database) GetAllProductsInBasket(username string) ([]models.Panier, err
return baskets, nil return baskets, nil
} }
// AddRewardToBasket ajoute un produit récompense au panier (prix = 0, is_reward = true). // AddRewardsToBasket ajoute plusieurs produits récompense au panier (prix = 0, is_reward = true).
// Supprime les anciens items récompense avant d'insérer les nouveaux.
// Pas de vérification de stock — les récompenses sont gérées par l'admin. // Pas de vérification de stock — les récompenses sont gérées par l'admin.
func (d *Database) AddRewardToBasket(username string, productID int, quantity float64, poolKey string) (*models.Panier, error) { func (d *Database) AddRewardsToBasket(username string, items []models.RewardItem, poolKey string) ([]models.Panier, error) {
var basket models.Panier var baskets []models.Panier
err := d.GDB.Transaction(func(tx *gorm.DB) error { err := d.GDB.Transaction(func(tx *gorm.DB) error {
// Vérifier que le produit existe
var productName string
if err := tx.Raw(`SELECT name FROM products WHERE id = ?`, productID).Scan(&productName).Error; err != nil || productName == "" {
return fmt.Errorf("produit récompense introuvable (id=%d)", productID)
}
// Supprimer tout article récompense existant (remplacement) // Supprimer tout article récompense existant (remplacement)
tx.Exec(`DELETE FROM baskets WHERE username = ? AND is_reward = true`, username) tx.Exec(`DELETE FROM baskets WHERE username = ? AND is_reward = true`, username)
// Insérer avec prix 0, is_reward = true et le pool_key for _, item := range items {
return tx.Raw(` if item.ProductID <= 0 || item.Quantity <= 0 {
continue
}
var productName string
if err := tx.Raw(`SELECT name FROM products WHERE id = ?`, item.ProductID).Scan(&productName).Error; err != nil || productName == "" {
return fmt.Errorf("produit récompense introuvable (id=%d)", item.ProductID)
}
var basket models.Panier
if err := tx.Raw(`
INSERT INTO baskets (username, product_id, quantity, price, is_reward, reward_pool_key, created_at) INSERT INTO baskets (username, product_id, quantity, price, is_reward, reward_pool_key, created_at)
VALUES (?, ?, ?, 0, true, ?, CURRENT_TIMESTAMP) VALUES (?, ?, ?, 0, true, ?, CURRENT_TIMESTAMP)
RETURNING id, username, product_id, quantity, price, is_reward, reward_pool_key, created_at`, RETURNING id, username, product_id, quantity, price, is_reward, reward_pool_key, created_at`,
username, productID, quantity, poolKey).Scan(&basket).Error username, item.ProductID, item.Quantity, poolKey).Scan(&basket).Error; err != nil {
return err
}
baskets = append(baskets, basket)
}
return nil
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &basket, nil return baskets, nil
} }
// HasOnlyRewardItems retourne true si le panier ne contient que des articles récompense. // HasOnlyRewardItems retourne true si le panier ne contient que des articles récompense.
+11 -10
View File
@@ -192,17 +192,18 @@ func ClaimMyReward(c *gin.Context) {
return return
} }
// Ajouter le produit récompense au panier si configuré // Ajouter les produits récompense au panier si configurés
productAdded := false productAdded := false
var productName string var productNames []string
if reward.RewardProductID > 0 && reward.RewardQuantity > 0 { if len(reward.RewardItems) > 0 {
qty := reward.RewardQuantity if added, addErr := database.AddRewardsToBasket(username, reward.RewardItems, req.PoolKey); addErr == nil && len(added) > 0 {
if item, addErr := database.AddRewardToBasket(username, reward.RewardProductID, qty, req.PoolKey); addErr == nil {
productAdded = true productAdded = true
productName = item.ProductName for _, item := range added {
log.Printf("✅ [CLAIM] Produit récompense id=%d (%.2f) ajouté au panier de %s", reward.RewardProductID, qty, username) productNames = append(productNames, item.ProductName)
} else { }
log.Printf("⚠️ [CLAIM] Impossible d'ajouter produit récompense: %v", addErr) log.Printf(" [CLAIM] %d produit(s) récompense ajoutés au panier de %s", len(added), username)
} else if addErr != nil {
log.Printf("⚠️ [CLAIM] Impossible d'ajouter produits récompense: %v", addErr)
} }
} }
@@ -211,7 +212,7 @@ func ClaimMyReward(c *gin.Context) {
"description": reward.Description, "description": reward.Description,
"remaining_rewards": remaining, "remaining_rewards": remaining,
"product_added": productAdded, "product_added": productAdded,
"product_name": productName, "product_names": productNames,
}) })
} }
+8 -2
View File
@@ -22,14 +22,20 @@ type RewardCategoryConfig struct {
Amount float64 `json:"amount"` // valeur monétaire de la récompense pour cette catégorie (ex: 30.0) Amount float64 `json:"amount"` // valeur monétaire de la récompense pour cette catégorie (ex: 30.0)
} }
// RewardItem représente un produit offert lors d'une récompense, avec sa quantité et son prix associé
type RewardItem struct {
ProductID int `json:"product_id"` // ID du produit ajouté au panier
Quantity float64 `json:"quantity"` // quantité offerte
Price float64 `json:"price"` // valeur indicative affichée au client
}
// PointsReward représente la récompense débloquée à partir d'un seuil de points cumulés // PointsReward représente la récompense débloquée à partir d'un seuil de points cumulés
type PointsReward struct { type PointsReward struct {
Threshold int `json:"threshold"` // points cumulés nécessaires (ex: 20) Threshold int `json:"threshold"` // points cumulés nécessaires (ex: 20)
Type string `json:"type"` // "free_product" | "half_price_product" | "custom" Type string `json:"type"` // "free_product" | "half_price_product" | "custom"
Description string `json:"description"` // description libre affichée au client Description string `json:"description"` // description libre affichée au client
CategoryConfigs []RewardCategoryConfig `json:"category_configs"` // catégories + produits éligibles CategoryConfigs []RewardCategoryConfig `json:"category_configs"` // catégories + produits éligibles
RewardProductID int `json:"reward_product_id"` // ID produit ajouté au panier (0 = désactivé) RewardItems []RewardItem `json:"reward_items"` // produits ajoutés au panier lors du claim
RewardQuantity float64 `json:"reward_quantity"` // quantité du produit récompense
} }
// DaySchedule représente les horaires de livraison pour un jour de la semaine // DaySchedule représente les horaires de livraison pour un jour de la semaine