saveinmed/backend-old/internal/infrastructure/mapbox/client.go
NANDO9322 35f86c8e26 feat: Melhorias na Gestão de Usuários, Correções de Frete e UI
Frontend:
- Refatoração completa do [GestaoUsuarioModal](cci:1://file:///c:/Projetos/saveinmed/saveinmed-frontend/src/components/GestaoUsuarioModal.tsx:17:0-711:2) para melhor visibilidade e UX.
- Correção de erro (crash) ao carregar endereços vazios.
- Nova interface de Configuração de Frete com abas para Entrega e Retirada.
- Correção na busca de dados completos da empresa (CEP, etc).
- Ajuste na chave de autenticação (`access_token`) no serviço de endereços.

Backend:
- Correção do erro 500 em [GetShippingSettings](cci:1://file:///c:/Projetos/saveinmed/backend-old/internal/repository/postgres/postgres.go:1398:0-1405:1) (tratamento de `no rows`).
- Ajustes nos handlers de endereço para suportar Admin/EntityID corretamente.
- Migrações de banco de dados para configurações de envio e coordenadas.
- Atualização da documentação Swagger e testes.
2026-01-27 21:27:03 -03:00

59 lines
1.3 KiB
Go

package mapbox
import (
"encoding/json"
"fmt"
"net/http"
"time"
)
type Client struct {
AccessToken string
HTTPClient *http.Client
}
func New(token string) *Client {
return &Client{
AccessToken: token,
HTTPClient: &http.Client{
Timeout: 10 * time.Second,
},
}
}
type directionsResponse struct {
Routes []struct {
Distance float64 `json:"distance"` // meters
Duration float64 `json:"duration"` // seconds
} `json:"routes"`
Code string `json:"code"`
}
// GetDrivingDistance returns distance in kilometers between two points
func (c *Client) GetDrivingDistance(lat1, lon1, lat2, lon2 float64) (float64, error) {
// Mapbox Directions API: /driving/{lon},{lat};{lon},{lat}
url := fmt.Sprintf("https://api.mapbox.com/directions/v5/mapbox/driving/%f,%f;%f,%f?access_token=%s",
lon1, lat1, lon2, lat2, c.AccessToken)
resp, err := c.HTTPClient.Get(url)
if err != nil {
return 0, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return 0, fmt.Errorf("mapbox api error: status %d", resp.StatusCode)
}
var result directionsResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return 0, err
}
if len(result.Routes) == 0 {
return 0, fmt.Errorf("no route found")
}
// Convert meters to km
return result.Routes[0].Distance / 1000.0, nil
}