From 93941bc4a7b23ec698c56f6fad7dc28cfd449d0c Mon Sep 17 00:00:00 2001 From: Alessandro Lattao Date: Mon, 9 Dec 2024 12:18:22 +0100 Subject: [PATCH] fix: import static files and templates via embedding --- internal/database/connection.go | 6 +++--- internal/server/renderer.go | 19 +++++++++++++++++-- internal/server/routes.go | 4 ++-- web/embed.go | 9 +++++++++ 4 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 web/embed.go diff --git a/internal/database/connection.go b/internal/database/connection.go index 370f578..2df719a 100644 --- a/internal/database/connection.go +++ b/internal/database/connection.go @@ -48,8 +48,8 @@ func NewConnection(logger zerolog.Logger, env *environment.Environment) (*DB, er } func connectWithRetries(logger zerolog.Logger, env *environment.Environment, dsn string) (*sqlx.DB, error) { - maxRetries := 10 - backoff := 3 * time.Second + maxRetries := 12 + backoff := 5 var db *sqlx.DB var err error @@ -61,7 +61,7 @@ func connectWithRetries(logger zerolog.Logger, env *environment.Environment, dsn } logger.Error().Err(err).Msgf("Connection failed (attempt %d/%d), retrying in %d seconds...", attempts+1, maxRetries, backoff) - time.Sleep(backoff) + time.Sleep(time.Duration(backoff) * time.Second) } return nil, fmt.Errorf("all connection attempts failed: %w", err) diff --git a/internal/server/renderer.go b/internal/server/renderer.go index f3fee62..51b1c59 100644 --- a/internal/server/renderer.go +++ b/internal/server/renderer.go @@ -3,7 +3,9 @@ package server import ( "html/template" "io" + "net/http" + "github.com/alessandrolattao/gosqladmin/web" "github.com/labstack/echo/v4" "github.com/rs/zerolog" ) @@ -15,14 +17,15 @@ type TemplateRenderer struct { } // NewTemplateRenderer initializes a new TemplateRenderer with the given logger. -// It loads HTML templates from the specified directory and adds custom functions. +// It loads HTML templates from the embedded filesystem and adds custom functions. func NewTemplateRenderer(logger zerolog.Logger) *TemplateRenderer { funcMap := template.FuncMap{ "add": func(a, b int) int { return a + b }, "subtract": func(a, b int) int { return a - b }, } - templates, err := template.New("").Funcs(funcMap).ParseGlob("web/templates/*.html") + // Parse templates from the embedded filesystem + templates, err := template.New("").Funcs(funcMap).ParseFS(web.TemplateFiles, "templates/*.html") if err != nil { logger.Fatal().Err(err).Msg("Error loading templates") } @@ -38,3 +41,15 @@ func (t *TemplateRenderer) Render(w io.Writer, name string, data interface{}, c } return err } + +// StaticFileHandler serves static files from the embedded filesystem. +func StaticFileHandler(logger zerolog.Logger) echo.HandlerFunc { + // Serve static files from the embedded filesystem + fileServer := http.FileServer(http.FS(web.StaticFiles)) + return func(c echo.Context) error { + requestPath := c.Request().URL.Path + fileServer.ServeHTTP(c.Response(), c.Request()) + logger.Info().Str("path", requestPath).Msg("Serving static file") + return nil + } +} diff --git a/internal/server/routes.go b/internal/server/routes.go index 7f6b6fd..629a6bb 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -16,6 +16,6 @@ func registerRoutes(e *echo.Echo, logger zerolog.Logger, db *database.DB, driver e.POST("/table/:databasename/:tablename", handlers.TableHandler()) e.POST("/query/:databasename", handlers.QueryHandler(logger, db, driverName)) - // Serve static files from the "web/static" directory - e.Static("/static", "web/static") + // Serve static files from the embedded filesystem + e.GET("/static/*", StaticFileHandler(logger)) } diff --git a/web/embed.go b/web/embed.go new file mode 100644 index 0000000..62df3f6 --- /dev/null +++ b/web/embed.go @@ -0,0 +1,9 @@ +package web + +import "embed" + +//go:embed static/* +var StaticFiles embed.FS + +//go:embed templates/* +var TemplateFiles embed.FS