From f179602f0be44cf2a1bb296c28a931e5c6f2d14f Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Fri, 11 Aug 2023 19:34:32 +0100 Subject: [PATCH] Continue parsing of Generate() --- imaging/generate.go | 3 ++- run/cli.go | 5 +++-- run/server.go | 50 +++++++++++++++++++++++++++----------------- traccar/positions.go | 15 +++++++++---- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/imaging/generate.go b/imaging/generate.go index 7580c94..cf80d49 100644 --- a/imaging/generate.go +++ b/imaging/generate.go @@ -4,10 +4,11 @@ import ( "fmt" "image" + "git.fjla.uk/fred.boniface/map-dots/data" "git.fjla.uk/fred.boniface/map-dots/log" ) -func Generate(height, width int, style, format string, data []string) image.Image { +func Generate(height, width int, style, format string, data []data.LocationData) image.Image { log.Msg.Debug("Image generation request: " + fmt.Sprint(width) + "x" + fmt.Sprint(height) + " " + format + " " + style) img := createCanvas(width, height) return img diff --git a/run/cli.go b/run/cli.go index 2c48a34..a6638ff 100644 --- a/run/cli.go +++ b/run/cli.go @@ -5,13 +5,14 @@ import ( "image" "os" + "git.fjla.uk/fred.boniface/map-dots/data" "git.fjla.uk/fred.boniface/map-dots/imaging" "git.fjla.uk/fred.boniface/map-dots/log" ) func CLI(height, width uint64, style, format, input string) { log.Msg.Info("CLI Mode Started") - fmt.Printf("Running CLI mode with height=%d, width=%d, type=%s, input=%s\n", height, width, style, input) + fmt.Printf("Running CLI mode with device=%s, height=%d, width=%d, type=%s, input=%s\n", "deviceId", height, width, style, input) fmt.Println("CLI Mode not implemented") if input == "traccar" { @@ -23,7 +24,7 @@ func CLI(height, width uint64, style, format, input string) { // Check that `input` is a valid filepath and points to a valid file. // Use relevent package to parse file // Pass parsed data to imaging package - var testing []string + var testing []data.LocationData var _ image.Image = imaging.Generate(1, 1, "circle", "png", testing) fmt.Println("End of implementation") } diff --git a/run/server.go b/run/server.go index af627b8..0dd9068 100644 --- a/run/server.go +++ b/run/server.go @@ -11,6 +11,8 @@ import ( "git.fjla.uk/fred.boniface/map-dots/imaging" "git.fjla.uk/fred.boniface/map-dots/log" + "git.fjla.uk/fred.boniface/map-dots/traccar" + "go.uber.org/zap" ) func Server() { @@ -43,9 +45,19 @@ func handleTraccarRequest(w http.ResponseWriter, r *http.Request) { fmt.Println(id, from, to) - var nullArry []string + locations, err := traccar.GetPositions(id, from, to) + if err != nil { + fmt.Println("Error fetching data: " + err.Error()) + log.Msg.Error("Error fetching traccar data", + zap.String("id", id), + zap.Time("from", from), + zap.Time("to", to), + zap.Error(err)) + } + log.Msg.Debug("Position data fetched") + fmt.Println(locations) - var _ = imaging.Generate(height, width, style, format, nullArry) + var _ = imaging.Generate(height, width, style, format, locations) message := map[string]string{ "status": "success", @@ -63,27 +75,27 @@ func handleTraccarRequest(w http.ResponseWriter, r *http.Request) { w.Write(jsonData) } -func validateAndProcessParams(queryValues url.Values) (string, string, string, int, int, string, string, error) { +func validateAndProcessParams(queryValues url.Values) (string, time.Time, time.Time, int, int, string, string, error) { // Validate and process individual parameters id := queryValues.Get("id") if id == "" { - return "", "", "", 0, 0, "", "", errors.New("missing required parameter 'id'") + return "", time.Time{}, time.Time{}, 0, 0, "", "", errors.New("missing required parameter 'id'") } - from := queryValues.Get("from") - to := queryValues.Get("to") + fromStr := queryValues.Get("from") + toStr := queryValues.Get("to") heightStr := queryValues.Get("height") widthStr := queryValues.Get("width") style := queryValues.Get("style") format := queryValues.Get("format") // Apply defaults if parameters are not specified - if from == "" { + if fromStr == "" { thirtyDaysAgo := time.Now().AddDate(0, 0, -30) - from = thirtyDaysAgo.UTC().Format(time.RFC3339) + fromStr = thirtyDaysAgo.UTC().Format(time.RFC3339) } - if to == "" { - to = time.Now().UTC().Format(time.RFC3339) + if toStr == "" { + toStr = time.Now().UTC().Format(time.RFC3339) } if heightStr == "" { heightStr = "1080" @@ -103,30 +115,30 @@ func validateAndProcessParams(queryValues url.Values) (string, string, string, i height, errHeight := strconv.Atoi(heightStr) width, errWidth := strconv.Atoi(widthStr) if errHeight != nil || errWidth != nil { - return "", "", "", 0, 0, "", "", errors.New("invalid height or width") + return "", time.Time{}, time.Time{}, 0, 0, "", "", errors.New("invalid height or width") } if height >= 7680 { - return "", "", "", 0, 0, "", "", errors.New("invalid height, max: 7680") + return "", time.Time{}, time.Time{}, 0, 0, "", "", errors.New("invalid height, max: 7680") } if width >= 4320 { - return "", "", "", 0, 0, "", "", errors.New("invalid width, max: 4320") + return "", time.Time{}, time.Time{}, 0, 0, "", "", errors.New("invalid width, max: 4320") } // VALIDATE FROM/TO // Parse the ISO date strings to time.Time objects - fromTime, errFrom := time.Parse(time.RFC3339, from) - toTime, errTo := time.Parse(time.RFC3339, to) + from, errFrom := time.Parse(time.RFC3339, fromStr) + to, errTo := time.Parse(time.RFC3339, toStr) if errFrom != nil || errTo != nil { - return "", "", "", 0, 0, "", "", errors.New("invalid date format") + return "", time.Time{}, time.Time{}, 0, 0, "", "", errors.New("invalid date format") } // Define the maximum allowable time duration (e.g., 90 days) maxAllowableDuration := time.Hour * 24 * 90 - // Calculate the duration between fromTime and toTime - duration := toTime.Sub(fromTime) + // Calculate the duration between from and to + duration := to.Sub(from) if duration > maxAllowableDuration { - return "", "", "", 0, 0, "", "", errors.New("date range is too wide, max: 90d") + return "", time.Time{}, time.Time{}, 0, 0, "", "", errors.New("date range is too wide, max: 90d") } // ... Validate other parameters as needed diff --git a/traccar/positions.go b/traccar/positions.go index 01ccf86..1dc5b2f 100644 --- a/traccar/positions.go +++ b/traccar/positions.go @@ -6,12 +6,14 @@ import ( "net/http" "net/url" "os" + "time" "git.fjla.uk/fred.boniface/map-dots/data" ) var user string = os.Getenv("TRACCAR_USER") var pass string = os.Getenv("TRACCAR_PASS") +var tUrl string = os.Getenv("TRACCAR_URL") var params = map[string]string{ "deviceId": "2", @@ -19,8 +21,13 @@ var params = map[string]string{ "to": "2023-08-10T20:00:00Z", } -func GetPositions() ([]data.LocationData, error) { - req, err := createRequest() +func GetPositions(id string, from, to time.Time) ([]data.LocationData, error) { + var params = map[string]string{ + "deviceId": id, + "from": from.Format("2006-01-02T15:04:05Z"), + "to": to.Format("2006-01-02T15:04:05Z"), + } + req, err := createRequest(params) if err != nil { return nil, err } @@ -46,8 +53,8 @@ func GetPositions() ([]data.LocationData, error) { return MapToPositionData(positions), err } -func createRequest() (*http.Request, error) { - baseURL := "https://traccar.fjla.uk/api/positions" +func createRequest(params map[string]string) (*http.Request, error) { + baseURL := tUrl + "/api/positions" u, err := url.Parse(baseURL) if err != nil {