chore: add new features for cabine

This commit is contained in:
2026-02-26 19:57:01 +01:00
parent 0fb4bd8a89
commit f91d4276cc
8 changed files with 467 additions and 323 deletions
+29 -2
View File
@@ -446,6 +446,35 @@ func (d *Database) CheckClientCanOrder(username string) (bool, float64, error) {
return true, 0, nil
}
func (d *Database) ResetClientPoint(username string, resetCancellationsPoint bool) error {
var query string
if resetCancellationsPoint {
query = `UPDATE clients SET point = 0, point_zipette = 0, updated_at = CURRENT_TIMESTAMP WHERE username = $1`
} else {
query = `UPDATE clients SET point = 0, updated_at = CURRENT_TIMESTAMP WHERE username = $1`
}
result, err := d.Exec(query, username)
if err != nil {
log.Printf("❌ [ResetClientPointAdmin] Erreur UPDATE: %v", err)
return fmt.Errorf("erreur reset points: %w", err)
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return fmt.Errorf("erreur vérification: %w", err)
}
if rowsAffected == 0 {
return fmt.Errorf("client non trouvé")
}
// Invalider le cache Redis du client
cacheKey := fmt.Sprintf("client:%s", username)
Redis.Del(RedisCtx, cacheKey)
return nil
}
func (d *Database) ResetClientPenalties(username string, resetCancellationsCount bool) error {
log.Printf("🔄 [ResetClientPenalties] Reset pour %s (reset_count=%v)", username, resetCancellationsCount)
@@ -477,8 +506,6 @@ func (d *Database) ResetClientPenalties(username string, resetCancellationsCount
return fmt.Errorf("client non trouvé")
}
log.Printf("✅ [ResetClientPenalties] Reset effectué pour %s", username)
// Invalider le cache Redis du client
cacheKey := fmt.Sprintf("client:%s", username)
Redis.Del(RedisCtx, cacheKey)
+34 -2
View File
@@ -935,9 +935,41 @@ func GetPenaltiesStats(c *gin.Context) {
})
}
func ResetClientPointAdmin(c *gin.Context) {
userRole := c.GetString("role")
if userRole != "admin" && userRole != "cabine" {
c.JSON(http.StatusForbidden, gin.H{"error": "Accès refusé"})
return
}
username := c.Param("username")
if username == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "Username requis"})
return
}
var req struct {
ResetCancellationsPoints bool `json:"reset_cancellations_points"`
}
if err := c.ShouldBindJSON(&req); err != nil {
req.ResetCancellationsPoints = false
}
database := c.MustGet("database").(*db.Database)
err := database.ResetClientPoint(username, req.ResetCancellationsPoints)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur lors de la réinitialisation",
"details": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{"message": "Points réinitialisés"})
}
// ResetClientPenaltiesAdmin réinitialise les pénalités d'un client (Admin seulement)
// POST /api/v2/admin/protected/client/:username/penalties/reset
// Body: {"reset_cancellations_count": false}
func ResetClientPenaltiesAdmin(c *gin.Context) {
userRole := c.GetString("role")
if userRole != "admin" && userRole != "cabine" {
+2 -2
View File
@@ -225,10 +225,10 @@ func SetupRoutes(router *gin.Engine, database *db.Database, geoService *services
cabineGroupV1.DELETE("/commands/:id", handlers.DeleteCommandByCabine)
// ⭐ NOUVEAU - ANNULATION PAR CABINE
cabineGroupV1.GET("/commands/cancelled", handlers.GetAllCancelledOrders)
cabineGroupV1.POST("/penalty", handlers.ApplyClientPenalty) // Appliquer pénalité
cabineGroupV1.GET("/client/:username/penalties", handlers.GetClientPenaltiesAdmin) // Voir pénalités client
cabineGroupV1.POST("/client/:username/penalties/reset", handlers.ResetClientPenaltiesAdmin) // Reset pénalités
cabineGroupV1.GET("/penalties/all", handlers.GetAllClientsWithPenalties) // Liste clients avec pénalités
cabineGroupV1.POST("/client/:username/point/reset", handlers.ResetClientPointAdmin)
cabineGroupV1.GET("/penalties/all", handlers.GetAllClientsWithPenalties) // Liste clients avec pénalités
cabineGroupV1.GET("/penalties/stats", handlers.GetPenaltiesStats)
// ============================================