datagraph/webserver.go
2025-07-02 18:02:09 +02:00

74 lines
1.5 KiB
Go

package main
import (
// External
"git.ahall.se/go/html_template"
// Standard
"encoding/json"
"fmt"
"io/fs"
"net/http"
"strconv"
)
var (
engine HTMLTemplate.Engine
)
func initWebserver() (err error) {
address := fmt.Sprintf("%s:%d", config.Network.Address, config.Network.Port)
logger.Info("webserver", "listen", address)
subViewFS, _ := fs.Sub(viewFS, "views")
subStaticFS, _ := fs.Sub(staticFS, "static")
engine, err = HTMLTemplate.NewEngine(subViewFS, subStaticFS, flagDev)
if err != nil {
return
}
http.HandleFunc("/", pageIndex)
http.HandleFunc("/app", pageApp)
http.HandleFunc("/nodes/tree/{startNode}", actionNodesTree)
err = http.ListenAndServe(address, nil)
return
}
func pageIndex(w http.ResponseWriter, r *http.Request) { // {{{
if r.URL.Path == "/" {
http.Redirect(w, r, "/app", http.StatusSeeOther)
} else {
engine.StaticResource(w, r)
}
} // }}}
func pageApp(w http.ResponseWriter, r *http.Request) { // {{{
page := NewPage("app")
err := engine.Render(page, w, r)
if err != nil {
w.Write([]byte(err.Error()))
}
} // }}}
func actionNodesTree(w http.ResponseWriter, r *http.Request) { // {{{
var err error
startNode := 0
startNodeStr := r.PathValue("startNode")
startNode, _ = strconv.Atoi(startNodeStr)
var maxDepth int
if maxDepth, err = strconv.Atoi(r.URL.Query().Get("depth")); err != nil {
maxDepth = 3
}
topNode, err := GetNode(startNode, maxDepth)
if err != nil {
logger.Error("test", "error", err)
}
j, _ := json.Marshal(topNode)
w.Write(j)
} // }}}