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