From 0ca4da4b6ce65cd5bf7584b96755eb1807c57eae Mon Sep 17 00:00:00 2001
From: Kelvin Ly <kelvin.ly1618@gmail.com>
Date: Mon, 15 May 2023 10:22:45 -0400
Subject: [PATCH] Modify the API format a bit and fix bug with the packet
 parsing logic

---
 shroom_internals/sql.go        |  8 ++++----
 shroom_internals/tcp_server.go | 10 +++++-----
 shroom_server.go               | 33 ++++++++++++++++++++++-----------
 3 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/shroom_internals/sql.go b/shroom_internals/sql.go
index 64e9be7..e555279 100644
--- a/shroom_internals/sql.go
+++ b/shroom_internals/sql.go
@@ -22,10 +22,10 @@ func CreateTable(db *sql.DB) error {
 }
 
 type Datapoint struct {
-	Time            uint64
-	Temperature     float32
-	Humidity        float32
-	HumidifierVolts float32
+	Time            uint64  `json:"t"`
+	Temperature     float32 `json:"temp"`
+	Humidity        float32 `json:"hum"`
+	HumidifierVolts float32 `json:"hv"`
 }
 
 func QueryHistory(db *sql.DB, start int64) ([]Datapoint, error) {
diff --git a/shroom_internals/tcp_server.go b/shroom_internals/tcp_server.go
index e32a0bf..d6efaa5 100644
--- a/shroom_internals/tcp_server.go
+++ b/shroom_internals/tcp_server.go
@@ -42,9 +42,9 @@ func (s *ShroomStatus) Update() {
 func parseMsg(line []byte, db *sql.DB, status *ShroomStatus) {
 	data := ShroomData{
 		Time:            0,
-		Temperature:     -1,
-		Humidity:        -1,
-		HumidifierVolts: -1,
+		Temperature:     -274,
+		Humidity:        -100,
+		HumidifierVolts: -100,
 		Status:          0,
 	}
 	err := json.Unmarshal(line, &data)
@@ -54,7 +54,7 @@ func parseMsg(line []byte, db *sql.DB, status *ShroomStatus) {
 		log.Println(line)
 		return
 	}
-	if data.Time > 0 && data.Temperature > 0 && data.Humidity > 0 && data.HumidifierVolts > 0 {
+	if data.Time > 0 && data.Temperature > -274 && data.Humidity > -100 && data.HumidifierVolts > -100 {
 		err = InsertRow(db, &data)
 		if err != nil {
 			log.Println("unable to write to database: ", err)
@@ -68,7 +68,7 @@ func parseMsg(line []byte, db *sql.DB, status *ShroomStatus) {
 		status.Unlock()
 		status.Update()
 	} else {
-		log.Println("unknown packet: ", line)
+		log.Println("unknown packet: ", line, string(line))
 	}
 
 }
diff --git a/shroom_server.go b/shroom_server.go
index cf1e511..2ba287e 100644
--- a/shroom_server.go
+++ b/shroom_server.go
@@ -16,6 +16,8 @@ import (
 	"io/fs"
 	"log"
 	"net/http"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -27,10 +29,19 @@ type statusJson struct {
 	Humidifier bool `json:"humidifier"`
 }
 
-func dumpData(db *sql.DB, offset int64) func(http.ResponseWriter, *http.Request) {
-	return func(w http.ResponseWriter, _req *http.Request) {
+func dumpData(db *sql.DB, multiplier int64) func(http.ResponseWriter, *http.Request) {
+	return func(w http.ResponseWriter, req *http.Request) {
 		now := time.Now().Unix()
-		t := now + offset
+		path := strings.Split(req.URL.Path, "/")
+		last := path[len(path)-1]
+		count, err := strconv.Atoi(last)
+		if err != nil {
+			w.WriteHeader(400)
+			w.Write([]byte("could not read integer in path: " + err.Error()))
+			return
+		}
+		offset := int64(count) * multiplier
+		t := now - offset
 		msg, err := s.GetRows(db, t)
 		if err != nil {
 			w.WriteHeader(500)
@@ -65,10 +76,10 @@ func main() {
 		log.Fatal("unable to use subdirectory of embedded fs: ", err)
 	}
 
-	dumpWeek := dumpData(db, -7*24*60*60)
-	dumpDay := dumpData(db, -24*60*60)
-	dumpHour := dumpData(db, -60*60)
-	dumpMinute := dumpData(db, -60)
+	dumpWeek := dumpData(db, 7*24*60*60*1000)
+	dumpDay := dumpData(db, 24*60*60*1000)
+	dumpHour := dumpData(db, 60*60*1000)
+	dumpMinute := dumpData(db, 60*1000)
 
 	lastPoint := func(w http.ResponseWriter, _req *http.Request) {
 		msg, err := s.LastTime(db)
@@ -115,10 +126,10 @@ func main() {
 
 	http.Handle("/d/", http.StripPrefix("/d/", http.FileServer(http.Dir("./dev"))))
 	http.Handle("/", http.FileServer(http.FS(contentSub)))
-	http.HandleFunc("/api/last/week", dumpWeek)
-	http.HandleFunc("/api/last/day", dumpDay)
-	http.HandleFunc("/api/last/hour", dumpHour)
-	http.HandleFunc("/api/last/minute", dumpMinute)
+	http.HandleFunc("/api/last/weeks/", dumpWeek)
+	http.HandleFunc("/api/last/days/", dumpDay)
+	http.HandleFunc("/api/last/hours/", dumpHour)
+	http.HandleFunc("/api/last/minutes/", dumpMinute)
 	http.HandleFunc("/api/latest", lastPoint)
 	http.HandleFunc("/api/status", getStatus)
 	http.HandleFunc("/api/admin", adminHandler)