Files
knet/src/main.go
JurajKubrican 6d2e54e7ad asset integrity
2025-08-04 22:50:30 +02:00

93 lines
2.0 KiB
Go

package main
import (
"html/template"
"io"
"net/http"
"strings"
"time"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/labstack/gommon/log"
"knet.sk/src/boxes"
"knet.sk/src/draw"
"knet.sk/src/util"
)
type Templates struct {
templates *template.Template
}
func (t *Templates) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
func NewTemplates() *Templates {
return &Templates{
templates: template.Must(template.ParseGlob("views/*.html")),
}
}
type Page struct {
Boxes []boxes.Box
BuildNumber string
Integrity *util.AssetIntegrity
}
func newPage(boxes []boxes.Box) Page {
return Page{
Boxes: boxes,
BuildNumber: util.GetBuildNumber(),
Integrity: util.CalculateAssetIntegrities(),
}
}
var (
e = echo.New()
)
func main() {
e.Renderer = NewTemplates()
e.Logger.SetLevel(log.DEBUG)
e.Use(middleware.Logger())
if util.IsProd() {
e.Use(middleware.Gzip())
e.Use(middleware.HTTPSRedirect())
}
e.GET("/health", func(c echo.Context) error {
return c.Render(200, "health", Page{
BuildNumber: util.GetBuildNumber(),
Integrity: util.CalculateAssetIntegrities(),
})
})
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if strings.HasPrefix(c.Request().URL.Path, "/css/") || strings.HasPrefix(c.Request().URL.Path, "/js/") {
c.Response().Header().Set("Cache-Control", "public, max-age=31536000") // 1 year
c.Response().Header().Set("Expires", time.Now().AddDate(1, 0, 0).Format(http.TimeFormat))
}
return next(c)
}
})
e.Static("/css", "css")
e.Static("/js", "js")
e.Static("/images", "images")
e.GET("/", func(c echo.Context) error {
return c.Render(200, "index", newPage(boxes.GetBoxes()))
})
e.GET("/boxes/ws", boxes.HandleBoxesWs)
e.GET("/draw", draw.Page)
e.GET("/draw/ws", draw.InitWs)
go boxes.RegisterTicker()
e.Logger.Fatal(e.Start(":54321"))
}