diff --git a/main.go b/main.go index 84d9217..bdc5d86 100644 --- a/main.go +++ b/main.go @@ -94,6 +94,7 @@ func main() { http.HandleFunc("/logout", logoutHandler) http.HandleFunc("/confirm", confirmHandler) http.HandleFunc("/metrics", metricsHandler) + http.HandleFunc("/downloadmetrics", downloadmetricsHandler) http.HandleFunc("/order", orderHandler) http.HandleFunc("/save_tracker_settings", save_tracker_settingsHandler) http.HandleFunc("/getstripepaymentintent", getstripepaymentintentHandler) diff --git a/metrics.go b/metrics.go index 52212e3..d663291 100644 --- a/metrics.go +++ b/metrics.go @@ -208,6 +208,126 @@ func metricsHandler(response http.ResponseWriter, request *http.Request) { } } +func downloadmetricsHandler(response http.ResponseWriter, request *http.Request) { + name := getUserName(request) + if name != "" { + + deveui, ok := request.URL.Query()["deveui"] + + if !ok || len(deveui[0]) < 1 { + log.Println("Url Param 'deveui' is missing") + fmt.Fprintf(response, "Error: deveui is missing") + return + } + // Query()["deveui"] will return an array of items, + // we only want the single item. + mydeveui := deveui[0] + + if !(Contains(getMyDevs(name), mydeveui)) { + log.Println("specified 'deveui' does not belong to this user") + fmt.Fprintf(response, "Error: specified deveui does not belong to this user") + return + } + + if AboExpired(mydeveui) { + log.Println("specified 'deveui' has an expired abo") + fmt.Fprintf(response, "Error: specified deveui has an expired abo") + return + } + + log.Println("Url Param 'deveui' is: " + string(mydeveui)) + + // Format of start and stop: YYYY-MM-DDTHH:MI:SSZ + + stop, ok := request.URL.Query()["stop"] + var mystop string + if !ok || len(stop[0]) < 1 { + log.Println("Url Param 'stop' is missing, set it to now") + mystop = time.Now().Format("2006-01-02T15:04:05Z") + } + + if ok { + mystop = stop[0] + } + + layout := "2006-01-02T15:04:05Z" + stopDate, err := time.Parse(layout, mystop) + + if err != nil { + fmt.Println(err) + } + + start, ok := request.URL.Query()["start"] + var mystart string + if !ok || len(start[0]) < 1 { + log.Println("Url Param 'start' is missing, set it to stop minus one day") + t := stopDate.AddDate(0, 0, -1) + mystart = t.Format("2006-01-02T15:04:05Z") + } + + if ok { + mystart = start[0] + } + + url := "http://localhost:8086/api/v2/query?org=wobischorg" + data := []byte(fmt.Sprintf(`from(bucket:"wobischbucket") + |> range(start: %s, stop: %s) + |> filter(fn: (r) => r._measurement == "measurement") + |> filter(fn: (r) => r._field == "lon" or r._field == "lat" or r._field == "vbat") + |> filter(fn: (r) => r.deveui == "%s") + |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")`, mystart, mystop, mydeveui)) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(data)) + if err != nil { + log.Fatal("Error reading request. ", err) + } + + // Set headers + req.Header.Set("Authorization", "Token "+INFLUX_RO_TOKEN) + req.Header.Set("accept", "application/csv") + req.Header.Set("content-type", "application/vnd.flux") + + // Set client timeout + client := &http.Client{Timeout: time.Second * 10} + + // Send request + resp, err := client.Do(req) + if err != nil { + log.Fatal("Error reading response. ", err) + } + defer resp.Body.Close() + + fmt.Println("response Status:", resp.Status) + fmt.Println("response Headers:", resp.Header) + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatal("Error reading body. ", err) + } + fmt.Println("response Body:", string(body)) + + scanner := bufio.NewScanner(strings.NewReader(string(body))) + + for scanner.Scan() { + s := strings.Split(scanner.Text(), ",") + fmt.Printf("Scanned Line: %v\n", s) + if (len(s) >= 11) && !(strings.HasPrefix(s[3], "_")) { + t, err := time.Parse(time.RFC3339, s[3]) + if err != nil { + fmt.Printf("error converting time: %s\n", s[3]) + continue + } + mytime := t.Format("02.01.2006 15:04") + fmt.Fprintf(response, "\"%s\",%s,%s\n", mytime, s[8], s[9]) + + } + } + + } else { + fmt.Fprintf(response, "Only available for logged in Users") + } +} + func vbat2percent(vbat string) int { i, err := strconv.Atoi(vbat) res := 0 diff --git a/minify-fa.sh b/minify-fa.sh index 756a381..b150eec 100755 --- a/minify-fa.sh +++ b/minify-fa.sh @@ -1 +1 @@ -cat /home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all.js |/home/appuser/wo-bisch-web/minify-fa-js.py home,address-card,balance-scale,sign-out-alt,sign-in-alt,calendar,globe,tint,battery-empty,battery-quarter,battery-half,battery-three-quarters,battery-full,battery-slash,envelope,check,lock,exclamation-triangle,cog,plus,shopping-cart,minus,arrow-right,caret-down,map-marked-alt,exclamation-triangle,envelope,shopping-cart >/home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all-minified.js +cat /home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all.js |/home/appuser/wo-bisch-web/minify-fa-js.py home,address-card,balance-scale,sign-out-alt,sign-in-alt,calendar,globe,tint,battery-empty,battery-quarter,battery-half,battery-three-quarters,battery-full,battery-slash,envelope,check,lock,exclamation-triangle,cog,plus,shopping-cart,minus,arrow-right,caret-down,map-marked-alt,exclamation-triangle,envelope,shopping-cart,download >/home/appuser/wo-bisch-web/static/js/fontawesome-5.11.2/all-minified.js diff --git a/snippets/map.html b/snippets/map.html index 42a48f3..6da52ef 100644 --- a/snippets/map.html +++ b/snippets/map.html @@ -26,6 +26,11 @@
+ + + + +
diff --git a/static/js/fontawesome-5.11.2/all-minified.js b/static/js/fontawesome-5.11.2/all-minified.js index 0151fdf..e83a50e 100644 --- a/static/js/fontawesome-5.11.2/all-minified.js +++ b/static/js/fontawesome-5.11.2/all-minified.js @@ -768,6 +768,8 @@ "cog": [512, 512, [], "f013", "M487.4 315.7l-42.6-24.6c4.3-23.2 4.3-47 0-70.2l42.6-24.6c4.9-2.8 7.1-8.6 5.5-14-11.1-35.6-30-67.8-54.7-94.6-3.8-4.1-10-5.1-14.8-2.3L380.8 110c-17.9-15.4-38.5-27.3-60.8-35.1V25.8c0-5.6-3.9-10.5-9.4-11.7-36.7-8.2-74.3-7.8-109.2 0-5.5 1.2-9.4 6.1-9.4 11.7V75c-22.2 7.9-42.8 19.8-60.8 35.1L88.7 85.5c-4.9-2.8-11-1.9-14.8 2.3-24.7 26.7-43.6 58.9-54.7 94.6-1.7 5.4.6 11.2 5.5 14L67.3 221c-4.3 23.2-4.3 47 0 70.2l-42.6 24.6c-4.9 2.8-7.1 8.6-5.5 14 11.1 35.6 30 67.8 54.7 94.6 3.8 4.1 10 5.1 14.8 2.3l42.6-24.6c17.9 15.4 38.5 27.3 60.8 35.1v49.2c0 5.6 3.9 10.5 9.4 11.7 36.7 8.2 74.3 7.8 109.2 0 5.5-1.2 9.4-6.1 9.4-11.7v-49.2c22.2-7.9 42.8-19.8 60.8-35.1l42.6 24.6c4.9 2.8 11 1.9 14.8-2.3 24.7-26.7 43.6-58.9 54.7-94.6 1.5-5.5-.7-11.3-5.6-14.1zM256 336c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z"], + "download": [512, 512, [], "f019", "M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"], + "envelope": [512, 512, [], "f0e0", "M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"], "envelope": [512, 512, [], "f0e0", "M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"], diff --git a/static/js/map.js b/static/js/map.js index be850d7..fec9809 100644 --- a/static/js/map.js +++ b/static/js/map.js @@ -26,9 +26,9 @@ var bounds; var boundsSwitzerland = new L.LatLngBounds([[47.826186, 10.511814], [45.797054, 5.925007]]); var dstart = moment({ hour: 0 }); -var start = dstart.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); +var s_start = dstart.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); var dstop = moment(); -var stop = dstop.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); +var s_stop = dstop.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); function vbat2icon(percent) { if (percent <= 20) { @@ -51,6 +51,14 @@ function vbat2icon(percent) { return ' ' + percent + ' %'; } +function getDownloadFilename(deveui, start, stop) { + var mdstart = moment(start); + var mdstop = moment(stop); + filename = deveui + "_" + mdstart.format('DD.MM.YYYY') + "_bis_" + mdstop.format('DD.MM.YYYY') + ".csv"; + console.log(filename); + return filename; +} + function refreshDatapoints(deveui, start, stop) { range = "" range = range + "&start=" + start; @@ -131,6 +139,9 @@ function refreshDatapoints(deveui, start, stop) { } $(document).ready(function () { + params = "deveui=" + deveui + "&alias=" + alias + "&start=" + s_start + "&stop=" + s_stop; + $("#btn_download").attr("href", "/downloadmetrics?" + params); + $("#btn_download").attr("download", getDownloadFilename(deveui, s_start, s_stop)); map = new L.Map('map', { crs: L.CRS.EPSG3857, zoomControl: true, @@ -157,22 +168,23 @@ $(document).ready(function () { map.addLayer(tilelayer); map.setView(L.latLng(lat, lon), 10); marker = L.marker([lat, lon], { icon: woBischIcon, zIndexOffset: 1000 }).addTo(map); - $('#reportrange span').html(moment(start).locale('de').format('D. MMM YYYY') + ' - ' + moment(stop).locale('de').format('D. MMM YYYY')); + $('#reportrange span').html(moment(s_start).locale('de').format('D. MMM YYYY') + ' - ' + moment(s_stop).locale('de').format('D. MMM YYYY')); - refreshDatapoints(deveui, start, stop); + refreshDatapoints(deveui, s_start, s_stop); }); $(function () { var start = moment({ hour: 0 }); var end = moment(); - var s_start = start.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); - var s_end = end.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); function cb(start, end) { $('#reportrange span').html(start.locale('de').format('D. MMM YYYY') + ' - ' + end.locale('de').format('D. MMM YYYY')); s_start = start.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); - s_end = end.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); - refreshDatapoints(deveui, s_start, s_end); + s_stop = end.utc().format('YYYY-MM-DDTHH:mm:ss[Z]'); + params = "deveui=" + deveui + "&alias=" + alias + "&start=" + s_start + "&stop=" + s_stop; + $("#btn_download").attr("href", "/downloadmetrics?" + params); + $("#btn_download").attr("download", getDownloadFilename(deveui, s_start, s_stop)); + refreshDatapoints(deveui, s_start, s_stop); } $('#reportrange').daterangepicker({