donetick/frontend/handler.go

54 lines
978 B
Go

package frontend
import (
"embed"
"io/fs"
"net/http"
"donetick.com/core/config"
"github.com/gin-gonic/gin"
)
//go:embed dist
var embeddedFiles embed.FS
type Handler struct {
ServeFrontend bool
}
func NewHandler(config *config.Config) *Handler {
return &Handler{
ServeFrontend: config.Server.ServeFrontend,
}
}
func Routes(router *gin.Engine, h *Handler) {
if h.ServeFrontend {
router.Use(staticMiddleware("dist"))
router.Static("/assets", "dist/assets")
// Gzip compression middleware
router.Group("/assets").Use(func(c *gin.Context) {
c.Header("Cache-Control", "max-age=31536000, immutable")
c.Next()
})
}
}
func staticMiddleware(root string) gin.HandlerFunc {
fileServer := http.FileServer(getFileSystem(root))
return func(c *gin.Context) {
fileServer.ServeHTTP(c.Writer, c.Request)
}
}
func getFileSystem(path string) http.FileSystem {
fs, err := fs.Sub(embeddedFiles, path)
if err != nil {
panic(err)
}
return http.FS(fs)
}