// ============================================ // handlers/history_handlers.go // ============================================ // Gestion de l'historique des commandes terminées package handlers import ( "fmt" "gestion/db" "log" "net/http" "github.com/gin-gonic/gin" ) // GetMyCompletedOrders récupère l'historique des commandes terminées du client // GET /api/v1/my-commands/history // ✅ Authentification requise (ClientMiddleware) // ✅ Retourne uniquement les commandes avec status = "approved" func GetMyCompletedOrders(c *gin.Context) { database := c.MustGet("database").(*db.Database) // ✅ SÉCURITÉ: Récupérer depuis JWT validé username, exists := c.Get("username") if !exists { log.Printf("❌ [HISTORY] Utilisateur non authentifié") c.JSON(http.StatusUnauthorized, gin.H{ "error": "Authentification requise", }) return } usernameStr := username.(string) log.Printf("📚 [HISTORY] Récupération historique pour: %s", usernameStr) // ✅ Récupérer les commandes terminées (approved) commands, err := database.GetCompletedCommandsByUsername(usernameStr) if err != nil { log.Printf("❌ [HISTORY] Erreur: %v", err) c.JSON(http.StatusInternalServerError, gin.H{ "error": "Erreur lors de la récupération de l'historique", "details": err.Error(), }) return } log.Printf("✅ [HISTORY] %d commandes terminées trouvées", len(commands)) // ✅ Récupérer les infos client pour statistiques client, err := database.GetClientByUsername(usernameStr) // ✅ Récupérer les noms des pools de points poolNames := []string{"Pool 1", "Pool 2"} if settings, sErr := database.GetSettings(); sErr == nil && len(settings.PointsPools) > 0 { poolNames = make([]string, len(settings.PointsPools)) for i, p := range settings.PointsPools { poolNames[i] = p.Name } } response := gin.H{ "success": true, "commands": commands, "count": len(commands), } if err == nil && client != nil { // Construire le tableau générique des valeurs par pool poolPoints := make([]int, len(poolNames)) if len(poolPoints) > 0 { poolPoints[0] = client.Point } if len(poolPoints) > 1 { poolPoints[1] = client.PointZipette } response["client_stats"] = gin.H{ "username": client.Username, "total_commands": client.Command, "points": client.Point, "pool_points": poolPoints, "pool_names": poolNames, "penalties": client.Amende, } } c.JSON(http.StatusOK, response) } // GetMyCompletedOrdersWithItems récupère l'historique avec les détails des items // GET /api/v1/my-commands/history/detailed // ✅ Authentification requise (ClientMiddleware) // ✅ Retourne les commandes approved avec tous les items func GetMyCompletedOrdersWithItems(c *gin.Context) { database := c.MustGet("database").(*db.Database) // ✅ SÉCURITÉ: Récupérer depuis JWT validé username, exists := c.Get("username") if !exists { log.Printf("❌ [HISTORY_DETAILED] Utilisateur non authentifié") c.JSON(http.StatusUnauthorized, gin.H{ "error": "Authentification requise", }) return } usernameStr := username.(string) log.Printf("📚 [HISTORY_DETAILED] Récupération historique détaillé pour: %s", usernameStr) // ✅ Récupérer les commandes terminées commands, err := database.GetCompletedCommandsByUsername(usernameStr) if err != nil { log.Printf("❌ [HISTORY_DETAILED] Erreur: %v", err) c.JSON(http.StatusInternalServerError, gin.H{ "error": "Erreur lors de la récupération de l'historique", "details": err.Error(), }) return } // ✅ Enrichir chaque commande avec ses items var enrichedCommands []map[string]interface{} for _, command := range commands { commandID, ok := command["id"].(int) if !ok { continue } // Récupérer les items de cette commande items, err := database.GetCommandItems(commandID) if err != nil { log.Printf("⚠️ [HISTORY_DETAILED] Erreur items pour cmd %d: %v", commandID, err) items = []map[string]interface{}{} } // Ajouter les items à la commande enrichedCommand := make(map[string]interface{}) for k, v := range command { enrichedCommand[k] = v } enrichedCommand["items"] = items enrichedCommand["items_count"] = len(items) enrichedCommands = append(enrichedCommands, enrichedCommand) } log.Printf("✅ [HISTORY_DETAILED] %d commandes enrichies", len(enrichedCommands)) // ✅ Récupérer les infos client client, err := database.GetClientByUsername(usernameStr) response := gin.H{ "success": true, "commands": enrichedCommands, "count": len(enrichedCommands), } if err == nil && client != nil { response["client_stats"] = gin.H{ "username": client.Username, "nom": client.Nom, "prenom": client.Prenom, "telephone": client.Telephone, "total_commands": client.Command, "points": client.Point, "penalties": client.Amende, } } c.JSON(http.StatusOK, response) } // GetOrderHistory récupère l'historique d'une commande spécifique avec logs // GET /api/v1/commands/:id/history // ✅ Authentification requise // ✅ Vérifie que la commande appartient au client func GetOrderHistory(c *gin.Context) { database := c.MustGet("database").(*db.Database) // ✅ SÉCURITÉ: Récupérer depuis JWT validé username, exists := c.Get("username") if !exists { log.Printf("❌ [ORDER_HISTORY] Utilisateur non authentifié") c.JSON(http.StatusUnauthorized, gin.H{ "error": "Authentification requise", }) return } usernameStr := username.(string) // Récupérer l'ID de la commande var commandID int if _, err := fmt.Sscanf(c.Param("id"), "%d", &commandID); err != nil { c.JSON(http.StatusBadRequest, gin.H{ "error": "ID de commande invalide", }) return } log.Printf("📜 [ORDER_HISTORY] Récupération historique cmd %d pour %s", commandID, usernameStr) // ✅ Vérifier que la commande existe command, err := database.GetCommandByID(commandID) if err != nil { log.Printf("❌ [ORDER_HISTORY] Commande non trouvée") c.JSON(http.StatusNotFound, gin.H{ "error": "Commande non trouvée", }) return } // ✅ Vérifier que la commande appartient au client cmdUsername, ok := command["username"].(string) if !ok || cmdUsername != usernameStr { log.Printf("❌ [ORDER_HISTORY] Accès refusé - cmd appartient à %s, pas à %s", cmdUsername, usernameStr) c.JSON(http.StatusForbidden, gin.H{ "error": "Cette commande ne vous appartient pas", }) return } // ✅ Récupérer les logs de la commande logs, err := database.GetCommandLogs(commandID) if err != nil { log.Printf("⚠️ [ORDER_HISTORY] Erreur logs: %v", err) logs = []map[string]interface{}{} } // ✅ Récupérer les items items, err := database.GetCommandItems(commandID) if err != nil { log.Printf("⚠️ [ORDER_HISTORY] Erreur items: %v", err) items = []map[string]interface{}{} } log.Printf("✅ [ORDER_HISTORY] Cmd %d: %d logs, %d items", commandID, len(logs), len(items)) c.JSON(http.StatusOK, gin.H{ "success": true, "command": command, "logs": logs, "logs_count": len(logs), "items": items, "items_count": len(items), }) }