package main import ( "context" "fmt" "log/slog" "net/http" "server/internal/config" "server/internal/db" "server/internal/handler" "server/internal/middleware" "server/internal/pkg/cache" "server/internal/pkg/logger" "server/internal/router" "server/internal/service" "github.com/go-chi/chi/v5" "go.uber.org/fx" ) func NewHttpServer(lc fx.Lifecycle, r *chi.Mux, cfg *config.Config) *http.Server { srv := &http.Server{ Addr: fmt.Sprintf("%s:%s", cfg.Server.Host, cfg.Server.Port), Handler: r, } lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { go func() { err := srv.ListenAndServe() if err != nil { slog.Error("server error", "error", err) } }() slog.Info(fmt.Sprintf("starting HTTP server http://%s", srv.Addr)) return nil }, OnStop: func(ctx context.Context) error { return srv.Shutdown(ctx) }, }) return srv } func main() { app := fx.New( fx.Provide( config.NewConfig, logger.New, db.NewDB, db.NewStore, db.NewRedisClient, cache.NewCaches, middleware.NewJWTMiddleware, middleware.NewAuthMiddleware, middleware.NewLoggerMiddleware, router.NewRouter, ), handler.Module, service.Module, fx.Invoke(func(*slog.Logger) {}), fx.Invoke(NewHttpServer), ) app.Run() }