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