chore: build

This commit is contained in:
2026-06-12 09:43:29 +02:00
parent 13df186854
commit 2ca28e730b
4 changed files with 79 additions and 17 deletions
+21
View File
@@ -115,6 +115,27 @@ func (d *Database) GetProductByID(id int) (models.Product, error) {
return p, nil
}
// GetProductNamesByIDs retourne un map id→name pour une liste d'IDs.
func (d *Database) GetProductNamesByIDs(ids []int) (map[int]string, error) {
result := make(map[int]string, len(ids))
if len(ids) == 0 {
return result, nil
}
rows, err := d.GDB.Raw(`SELECT id, name FROM products WHERE id IN ?`, ids).Rows()
if err != nil {
return result, err
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err == nil {
result[id] = name
}
}
return result, nil
}
func (d *Database) GetAllProducts() ([]models.Product, error) {
log.Println("📦 [GetAllProducts] START")
+43 -11
View File
@@ -40,16 +40,35 @@ func GetMyPointsRewards(c *gin.Context) {
reward := settings.PointsReward
type PoolInfo struct {
Key string `json:"key"`
Name string `json:"name"`
Points int `json:"points"`
RewardsEarned int `json:"rewards_earned"`
RewardsClaimed int `json:"rewards_claimed"`
RewardsAvailable int `json:"rewards_available"`
EligibleConfigs []models.RewardCategoryConfig `json:"eligible_configs"`
type EligibleConfigResponse struct {
Category string `json:"category"`
AllProducts bool `json:"all_products"`
ProductIDs []int `json:"product_ids"`
ProductNames []string `json:"product_names"`
Amount float64 `json:"amount"`
}
type PoolInfo struct {
Key string `json:"key"`
Name string `json:"name"`
Points int `json:"points"`
RewardsEarned int `json:"rewards_earned"`
RewardsClaimed int `json:"rewards_claimed"`
RewardsAvailable int `json:"rewards_available"`
EligibleConfigs []EligibleConfigResponse `json:"eligible_configs"`
}
// Collecter tous les product_ids nécessaires en un seul passage
allProductIDs := make([]int, 0)
if reward != nil {
for _, cfg := range reward.CategoryConfigs {
if !cfg.AllProducts {
allProductIDs = append(allProductIDs, cfg.ProductIDs...)
}
}
}
productNames, _ := database.GetProductNamesByIDs(allProductIDs)
pools := make([]PoolInfo, 0, len(settings.PointsPools))
for _, pool := range settings.PointsPools {
pts := pointsExtra[pool.Key]
@@ -69,12 +88,25 @@ func GetMyPointsRewards(c *gin.Context) {
for _, c := range pool.Categories {
poolCats[c] = true
}
eligibleConfigs := make([]models.RewardCategoryConfig, 0)
eligibleConfigs := make([]EligibleConfigResponse, 0)
if reward != nil {
for _, cfg := range reward.CategoryConfigs {
if poolCats[cfg.Category] {
eligibleConfigs = append(eligibleConfigs, cfg)
if !poolCats[cfg.Category] {
continue
}
names := make([]string, 0, len(cfg.ProductIDs))
for _, pid := range cfg.ProductIDs {
if n, ok := productNames[pid]; ok {
names = append(names, n)
}
}
eligibleConfigs = append(eligibleConfigs, EligibleConfigResponse{
Category: cfg.Category,
AllProducts: cfg.AllProducts,
ProductIDs: cfg.ProductIDs,
ProductNames: names,
Amount: cfg.Amount,
})
}
}
+1
View File
@@ -2145,6 +2145,7 @@ export type RewardCategoryConfig = {
category: string;
all_products: boolean;
product_ids: number[];
product_names: string[];
amount: number;
};
@@ -315,13 +315,21 @@ function ConsultationHistorique() {
<span className="reward-pool-name">{pool.name}</span>
<span className="reward-pool-pts">{pool.points} pts</span>
</div>
{pool.eligible_configs.some((cfg) => cfg.all_products) && (
{pool.eligible_configs.length > 0 && (
<div className="reward-eligible-cats">
{pool.eligible_configs.filter((cfg) => cfg.all_products).map((cfg) => (
<span key={cfg.category} className="reward-eligible-cat">
{cfg.category}{cfg.amount > 0 ? `${cfg.amount}` : ""}
</span>
))}
{pool.eligible_configs.map((cfg) =>
cfg.all_products ? (
<span key={cfg.category} className="reward-eligible-cat">
{cfg.category}{cfg.amount > 0 ? `${cfg.amount}` : ""}
</span>
) : (
cfg.product_names.map((name) => (
<span key={name} className="reward-eligible-cat">
{name}
</span>
))
)
)}
</div>
)}
<div className="reward-progress-bar">