// ============================================ // handlers/gps_handlers.go // Gestion des liens GPS et visualisation // ============================================ package handlers import ( "gestion/db" "log" "net/http" "strconv" "github.com/gin-gonic/gin" ) // GetDeliveryPersonMapLinks génère les liens de cartes pour visualiser la position d'un livreur // GET /api/v2/admin/protected/delivery-persons/:username/map-links func GetDeliveryPersonMapLinks(c *gin.Context) { database := c.MustGet("database").(*db.Database) // Vérification du rôle admin 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 } log.Printf("🗺️ [MAP_LINKS] Demande pour livreur: %s", username) // Récupérer la position GPS du livreur lat, lon, err := database.GetDeliveryPersonLocation(username) if err != nil { log.Printf("❌ [MAP_LINKS] Erreur position: %v", err) c.JSON(http.StatusNotFound, gin.H{ "success": false, "error": "Position GPS non disponible pour ce livreur", "details": err.Error(), "message": "Le livreur n'a pas encore partagé sa position ou est hors ligne", }) return } // Validation des coordonnées if lat == 0 && lon == 0 { log.Printf("⚠️ [MAP_LINKS] Coordonnées invalides (0,0) pour %s", username) c.JSON(http.StatusNotFound, gin.H{ "success": false, "error": "Coordonnées GPS invalides (0,0)", "message": "Le livreur doit mettre à jour sa position", }) return } // Générer les liens de cartes mapLinks := database.GenerateMapLinks(lat, lon, username) log.Printf("✅ [MAP_LINKS] Liens générés pour %s: (%.6f, %.6f)", username, lat, lon) c.JSON(http.StatusOK, gin.H{ "success": true, "deliveryman": gin.H{ "username": username, }, "location": gin.H{ "latitude": lat, "longitude": lon, "valid": true, }, "map_links": mapLinks, }) } // GetCommandNavigationLinks génère les liens de navigation pour une commande // GET /api/v2/admin/protected/commands/:id/navigation-links func GetCommandNavigationLinks(c *gin.Context) { database := c.MustGet("database").(*db.Database) userRole := c.GetString("role") if userRole != "admin" { c.JSON(http.StatusForbidden, gin.H{"error": "Accès refusé"}) return } commandID, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "ID de commande invalide"}) return } // Récupérer la commande command, err := database.GetCommandByID(commandID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Commande non trouvée"}) return } // Vérifier qu'un livreur est assigné livreurAssign, ok := command["livreur_assign"].(string) if !ok || livreurAssign == "" { c.JSON(http.StatusNotFound, gin.H{ "error": "Aucun livreur assigné à cette commande", }) return } // Générer les liens de navigation links, err := database.GenerateMapLinksForCommand(commandID, livreurAssign) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{ "error": "Erreur génération des liens", "details": err.Error(), }) return } c.JSON(http.StatusOK, gin.H{ "success": true, "command_id": commandID, "deliveryman": livreurAssign, "navigation_links": links, }) }