130 lines
3.4 KiB
Go
130 lines
3.4 KiB
Go
// ============================================
|
|
// 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,
|
|
})
|
|
}
|