package http import ( "context" "fmt" "net/http" "time" "github.com/labstack/echo/v4" "go.uber.org/fx" "go.uber.org/zap" "epic-ent/internal/config" ) func NewEcho() *echo.Echo { return echo.New() } func StartServer(lc fx.Lifecycle, cfg *config.Config, e *echo.Echo, logger *zap.Logger) { addr := fmt.Sprintf(":%d", cfg.Server.Port) if cfg.Server.ReadTimeout != "" { if d, err := time.ParseDuration(cfg.Server.ReadTimeout); err == nil { e.Server.ReadTimeout = d } } if cfg.Server.WriteTimeout != "" { if d, err := time.ParseDuration(cfg.Server.WriteTimeout); err == nil { e.Server.WriteTimeout = d } } lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { logger.Info("http server starting", zap.String("addr", addr)) go func() { if err := e.Start(addr); err != nil && err != http.ErrServerClosed { logger.Error("http server stopped", zap.Error(err)) } }() return nil }, OnStop: func(ctx context.Context) error { logger.Info("http server stopping") return e.Shutdown(ctx) }, }) }