62 lines
1.2 KiB
Go
62 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"caltrack/ai"
|
|
"caltrack/api"
|
|
cfgpkg "caltrack/config"
|
|
"caltrack/db"
|
|
"embed"
|
|
"fmt"
|
|
"io/fs"
|
|
"log"
|
|
"net/http"
|
|
)
|
|
|
|
//go:embed web
|
|
var webFS embed.FS
|
|
|
|
func main() {
|
|
cfg, err := cfgpkg.Load()
|
|
if err != nil {
|
|
log.Printf("Warning: could not load config: %v (using defaults)", err)
|
|
}
|
|
|
|
database, err := db.New()
|
|
if err != nil {
|
|
log.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer database.Close()
|
|
|
|
aiClient := ai.New(&cfg, database)
|
|
|
|
handler := api.New(database, aiClient, &cfg)
|
|
|
|
mux := http.NewServeMux()
|
|
handler.RegisterRoutes(mux)
|
|
|
|
// Serve embedded web files
|
|
webContent, err := fs.Sub(webFS, "web")
|
|
if err != nil {
|
|
log.Fatalf("Failed to setup web filesystem: %v", err)
|
|
}
|
|
|
|
mux.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Path == "/" {
|
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
|
data, _ := fs.ReadFile(webContent, "index.html")
|
|
w.Write(data)
|
|
return
|
|
}
|
|
http.FileServer(http.FS(webContent)).ServeHTTP(w, r)
|
|
})
|
|
|
|
addr := cfg.ListenAddr
|
|
if addr == "" {
|
|
addr = ":8080"
|
|
}
|
|
|
|
fmt.Printf("CalTrack running at http://localhost%s\n", addr)
|
|
if err := http.ListenAndServe(addr, mux); err != nil {
|
|
log.Fatalf("Server error: %v", err)
|
|
}
|
|
}
|