chore: refacto

This commit is contained in:
2026-04-20 19:41:52 +02:00
parent 5fc52c72ee
commit 2e9827af98
46 changed files with 497 additions and 648 deletions
+23 -77
View File
@@ -21,34 +21,24 @@ import (
// GÉOCODAGE D'ADRESSES
// ============================================
// GeocodeAddress convertit une adresse en coordonnées GPS
func GeocodeAddress(c *gin.Context) {
geoService := c.MustGet("geoService").(*services.GeoService)
var req struct {
Address string `json:"address" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Adresse requise",
"details": err.Error(),
})
c.JSON(http.StatusBadRequest, gin.H{"error": "Adresse requise"})
return
}
location, err := geoService.GeocodeAddress(req.Address)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{
"error": "Impossible de géocoder cette adresse",
"details": err.Error(),
})
c.JSON(http.StatusNotFound, gin.H{"error": "Impossible de géocoder cette adresse"})
return
}
log.Printf("📍 Adresse géocodée: %s -> (%.6f, %.6f)",
req.Address, location.Latitude, location.Longitude)
log.Printf("📍 Adresse géocodée: %s -> (%.6f, %.6f)", req.Address, location.Latitude, location.Longitude)
c.JSON(http.StatusOK, gin.H{
"success": true,
"latitude": location.Latitude,
@@ -76,8 +66,7 @@ func FindNearestDeliveryPerson(c *gin.Context) {
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Données invalides",
"details": err.Error(),
"error": "Données invalides",
})
return
}
@@ -89,8 +78,7 @@ func FindNearestDeliveryPerson(c *gin.Context) {
location, err := geoService.GeocodeAddress(req.Address)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Impossible de géocoder l'adresse",
"details": err.Error(),
"error": "Impossible de géocoder l'adresse",
})
return
}
@@ -110,8 +98,7 @@ func FindNearestDeliveryPerson(c *gin.Context) {
// Valider les coordonnées
if err := services.ValidateCoordinates(targetCoords); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Coordonnées invalides",
"details": err.Error(),
"error": "Coordonnées invalides",
})
return
}
@@ -135,8 +122,7 @@ func FindNearestDeliveryPerson(c *gin.Context) {
nearest, err := geoService.FindNearestDeliveryPersonFast(targetCoords, usernames)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{
"error": "Aucun livreur avec position GPS valide",
"details": err.Error(),
"error": "Aucun livreur avec position GPS valide",
})
return
}
@@ -193,8 +179,7 @@ func GetAllDeliveryDistances(c *gin.Context) {
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Données invalides",
"details": err.Error(),
"error": "Données invalides",
})
return
}
@@ -205,8 +190,7 @@ func GetAllDeliveryDistances(c *gin.Context) {
location, err := geoService.GeocodeAddress(req.Address)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Impossible de géocoder l'adresse",
"details": err.Error(),
"error": "Impossible de géocoder l'adresse",
})
return
}
@@ -224,8 +208,7 @@ func GetAllDeliveryDistances(c *gin.Context) {
if err := services.ValidateCoordinates(targetCoords); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Coordonnées invalides",
"details": err.Error(),
"error": "Coordonnées invalides",
})
return
}
@@ -246,8 +229,7 @@ func GetAllDeliveryDistances(c *gin.Context) {
distances, err := geoService.GetAllDeliveryDistances(targetCoords, usernames)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur calcul des distances",
"details": err.Error(),
"error": "Erreur calcul des distances",
})
return
}
@@ -317,7 +299,6 @@ func AutoAssignNearestDeliveryPerson(c *gin.Context) {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Impossible de géocoder l'adresse de livraison",
"address": address,
"details": err.Error(),
})
return
}
@@ -375,8 +356,7 @@ func AutoAssignNearestDeliveryPerson(c *gin.Context) {
travelTime, distance, err := calculateTravelTimeWithTomTom(geoService, singleDeliveryman, location.Latitude, location.Longitude)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur calcul ETA",
"details": err.Error(),
"error": "Erreur calcul ETA",
})
return
}
@@ -385,8 +365,7 @@ func AutoAssignNearestDeliveryPerson(c *gin.Context) {
err = database.AssignCommandToDeliverymanQueueWithCoords(commandID, singleDeliveryman, travelTime, location.Latitude, location.Longitude, address)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur lors de l'assignation",
"details": err.Error(),
"error": "Erreur lors de l'assignation",
})
return
}
@@ -440,8 +419,7 @@ func AutoAssignNearestDeliveryPerson(c *gin.Context) {
travelTime, distance, err := calculateTravelTimeWithTomTom(geoService, leastLoaded, location.Latitude, location.Longitude)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur calcul ETA",
"details": err.Error(),
"error": "Erreur calcul ETA",
})
return
}
@@ -450,8 +428,7 @@ func AutoAssignNearestDeliveryPerson(c *gin.Context) {
err = database.ForceAssignCommandToDeliverymanWithCoords(commandID, leastLoaded, travelTime, location.Latitude, location.Longitude, address)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur lors de l'assignation forcée",
"details": err.Error(),
"error": "Erreur lors de l'assignation forcée",
})
return
}
@@ -506,8 +483,7 @@ func AutoAssignNearestDeliveryPerson(c *gin.Context) {
nearest, err := geoService.FindNearestDeliveryPersonFast(targetCoords, usernames)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{
"error": "Aucun livreur avec position GPS valide",
"details": err.Error(),
"error": "Aucun livreur avec position GPS valide",
})
return
}
@@ -527,8 +503,7 @@ func AutoAssignNearestDeliveryPerson(c *gin.Context) {
err = database.AssignCommandToDeliverymanQueueWithCoords(commandID, nearest.Username, travelTime, location.Latitude, location.Longitude, address)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur lors de l'assignation",
"details": err.Error(),
"error": "Erreur lors de l'assignation",
})
return
}
@@ -582,8 +557,7 @@ func AutoAssignAllPendingCommands(c *gin.Context) {
commands, err := database.GetAllCommands("pending", "")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur récupération des commandes",
"details": err.Error(),
"error": "Erreur récupération des commandes",
})
return
}
@@ -742,8 +716,7 @@ func GetAllDeliveryQueues(c *gin.Context) {
overview, err := database.GetAllQueuesOverview()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur récupération des queues",
"details": err.Error(),
"error": "Erreur récupération des queues",
})
return
}
@@ -802,8 +775,7 @@ func GetDeliverymanQueue(c *gin.Context) {
queueInfo, err := database.GetDeliverymanQueueInfo(username)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"error": "Erreur récupération de la queue",
"details": err.Error(),
"error": "Erreur récupération de la queue",
})
return
}
@@ -814,41 +786,23 @@ func GetDeliverymanQueue(c *gin.Context) {
})
}
// ============================================
// VALIDATION D'ADRESSE
// ============================================
// ValidateAddress vérifie si une adresse peut être géocodée
// POST /api/v1/validate-address
// Body: {"address": "123 Main St, Paris"}
func ValidateAddress(c *gin.Context) {
geoService := c.MustGet("geoService").(*services.GeoService)
var req struct {
Address string `json:"address" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Adresse requise",
"details": err.Error(),
})
c.JSON(http.StatusBadRequest, gin.H{"error": "Adresse requise"})
return
}
isValid := geoService.IsValidAddress(req.Address)
if !isValid {
c.JSON(http.StatusOK, gin.H{
"valid": false,
"message": "Adresse introuvable ou invalide",
})
if !geoService.IsValidAddress(req.Address) {
c.JSON(http.StatusOK, gin.H{"valid": false, "message": "Adresse introuvable ou invalide"})
return
}
// Récupérer les détails
location, _ := geoService.GeocodeAddress(req.Address)
c.JSON(http.StatusOK, gin.H{
"valid": true,
"message": "Adresse valide",
@@ -858,13 +812,7 @@ func ValidateAddress(c *gin.Context) {
})
}
// ============================================
// HELPER FUNCTION - CALCUL ETA AVEC TOMTOM
// ============================================
// calculateTravelTimeWithTomTom calcule l'ETA avec TomTom ou fallback local
func calculateTravelTimeWithTomTom(geoService *services.GeoService, deliverymanUsername string, targetLat, targetLon float64) (int, float64, error) {
// Récupérer position du livreur
deliverymanLoc, err := geoService.GetDeliveryPersonLocation(deliverymanUsername)
if err != nil {
return 0, 0, fmt.Errorf("position du livreur introuvable: %w", err)
@@ -875,10 +823,8 @@ func calculateTravelTimeWithTomTom(geoService *services.GeoService, deliverymanU
Longitude: targetLon,
}
// Calculer ETA avec TomTom (avec fallback automatique intégré)
travelTime, distance, err := services.GetETAWithTraffic(*deliverymanLoc, targetCoords)
if err != nil {
// Fallback sur calcul local
distance = services.CalculateDistance(*deliverymanLoc, targetCoords)
travelTime = services.CalculateETA(distance)
log.Printf("⚠️ TomTom indisponible pour %s, fallback: %.2f km -> %d min",