package traccar import ( "encoding/json" "io" "net/http" "net/url" "os" "git.fjla.uk/fred.boniface/map-dots/data" ) var user string = os.Getenv("TRACCAR_USER") var pass string = os.Getenv("TRACCAR_PASS") var params = map[string]string{ "deviceId": "2", "from": "2023-07-10T20:00:00Z", "to": "2023-08-10T20:00:00Z", } func GetPositions() ([]data.LocationData, error) { req, err := createRequest() if err != nil { return nil, err } client := http.Client{} resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return nil, err } var positions []Positions err = json.Unmarshal(body, &positions) if err != nil { return nil, err } return MapToPositionData(positions), err } func createRequest() (*http.Request, error) { baseURL := "https://traccar.fjla.uk/api/positions" u, err := url.Parse(baseURL) if err != nil { return nil, err } queryParams := url.Values{} for key, value := range params { queryParams.Add(key, value) } u.RawQuery = queryParams.Encode() req, err := http.NewRequest("GET", u.String(), nil) if err != nil { return nil, err } req.SetBasicAuth(user, pass) return req, nil } type Attributes map[string]interface{} // Generic map to hold attributes type Positions struct { ID int64 `json:"id"` Attributes Attributes `json:"attributes"` DeviceID int64 `json:"deviceId"` Protocol string `json:"protocol"` ServerTime string `json:"serverTime"` DeviceTime string `json:"deviceTime"` FixTime string `json:"fixTime"` Outdated bool `json:"outdated"` Valid bool `json:"valid"` Latitude float64 `json:"latitude"` Longitude float64 `json:"longitude"` Altitude float64 `json:"altitude"` Speed float64 `json:"speed"` Course float64 `json:"course"` Address string `json:"address"` Accuracy float64 `json:"accuracy"` Network interface{} `json:"network"` // Inferred as interface{} since it's not clear GeofenceIDs interface{} `json:"geofenceIds"` // Inferred as interface{} since it's not clear }