shrooms-server/shroom_server.go

107 lines
2.2 KiB
Go

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()
}