package web
import (
"bytes"
"embed"
"html/template"
"git.ulra.eu/adro/miniwol/config"
"github.com/labstack/echo/v4"
)
//go:embed template/*
var templateFS embed.FS
var templates *template.Template
func init() {
var err error
templates, err = template.ParseFS(templateFS, "template/*.html")
if err != nil {
panic(err)
}
}
func Run() error {
e := echo.New()
e.GET("/", index)
e.GET("/style.css", style)
e.GET("/favicon.ico", favicon)
e.POST("/auth", auth)
e.POST("/deauth", withAuth(deauth))
e.POST("/add", withAuth(add))
e.POST("/wake", withAuth(wake))
e.POST("/remove", withAuth(remove))
return e.Start(config.Config.Server)
}
func Page(c echo.Context, code int, title string, page string, auth bool, data interface{}) error {
var contentBuffer bytes.Buffer
err := templates.ExecuteTemplate(&contentBuffer, page, data)
if err != nil {
return err
}
var pageBuffer bytes.Buffer
err = templates.ExecuteTemplate(&pageBuffer, "page.html", struct {
Title string
Content template.HTML
Auth bool
}{
Title: title,
Content: template.HTML(contentBuffer.String()),
Auth: auth,
})
if err != nil {
return err
}
return c.HTML(code, pageBuffer.String())
}
// Handlers
func index(c echo.Context) error {
session, err := c.Cookie("session")
if err != nil || checkAuth(session.Value) != nil {
return Page(c, 200, "Login", "login.html", false, nil)
} else {
return Page(c, 200, "Devices", "device.html", true, config.Config)
}
}
func style(c echo.Context) error {
styleData, err := templateFS.ReadFile("template/style.css")
if err != nil {
return err
}
return c.Blob(200, "text/css", styleData)
}
func favicon(c echo.Context) error {
return c.NoContent(204)
}