package main import ( _ "github.com/mattn/go-sqlite3" ) import ( s "shroom_server/shroom_internals" ) import ( "database/sql" "embed" "io/fs" "log" "net/http" "time" ) //go:embed static/* var content embed.FS type commandDispatcher struct { // TODO } func dumpData(db *sql.DB, offset int64) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, _req *http.Request) { now := time.Now().Unix() t := now + offset msg, err := s.GetRows(db, t) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) } else { w.Write(msg) } } } func main() { db, err := sql.Open("sqlite3", "shrooms.db") if err != nil { log.Fatal("unable to open db ", err) } if err = db.Ping(); err != nil { log.Fatal("unable to ping db ", err) } err = s.CreateTable(db) if err != nil { log.Fatal("unable to create table ", err) } status := s.ShroomStatus{} s.InitTcpServer(db, &status) contentSub, err := fs.Sub(content, "static") if err != nil { 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) lastPoint := func(w http.ResponseWriter, _req *http.Request) { msg, err := s.LastTime(db) if err != nil { w.WriteHeader(500) w.Write([]byte(err.Error())) } else { w.Write(msg) } } getStatus := func(w http.ResponseWriter, _req *http.Request) { status.Lock.RLock() num_connections := status.NumConnections status.Lock.RUnlock() if num_connections > 0 { w.Write([]byte("foo")) } // TODO } adminHandler := func(w http.ResponseWriter, req *http.Request) { // TODO } http.Handle("/", http.FileServer(http.FS(contentSub))) http.HandleFunc("/api/data/week", dumpWeek) http.HandleFunc("/api/data/day", dumpDay) http.HandleFunc("/api/data/hour", dumpHour) http.HandleFunc("/api/last_point", lastPoint) http.HandleFunc("/api/status", getStatus) http.HandleFunc("/api/admin", adminHandler) // TODO periodically clear old entries from the database err = http.ListenAndServe("localhost:8080", nil) if err != nil { log.Fatal("unable to start server: ", err) } defer db.Close() }