From f9ef25b285de2a423658b3edb46bc96ac4014ca8 Mon Sep 17 00:00:00 2001 From: Sergey Chubaryan Date: Sun, 18 Aug 2024 21:16:07 +0300 Subject: [PATCH] moved server initialization --- main.go | 60 ++++++-------------------------- src/server/server.go | 81 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 src/server/server.go diff --git a/main.go b/main.go index dff4fd9..28a36d5 100644 --- a/main.go +++ b/main.go @@ -9,22 +9,18 @@ import ( "backend/src/core/services" "backend/src/core/utils" "backend/src/logger" - "backend/src/server/handlers" - "backend/src/server/middleware" + "backend/src/server" "context" "crypto/rsa" "crypto/x509" "database/sql" "encoding/pem" - "fmt" - "net" "os" "os/signal" "runtime/pprof" "syscall" "time" - "github.com/gin-gonic/gin" "github.com/jackc/pgx" "github.com/jackc/pgx/stdlib" ) @@ -135,32 +131,6 @@ func main() { }, ) - // if !debugMode { - gin.SetMode(gin.ReleaseMode) - // } - - r := gin.New() - r.Use(middleware.NewRequestLogMiddleware(logger)) - r.Use(gin.Recovery()) - - r.Static("/webapp", "./webapp") - - r.GET("/pooling", handlers.NewLongPoolingHandler(clientNotifier)) - - linkGroup := r.Group("/s") - linkGroup.POST("/new", handlers.NewShortlinkCreateHandler(linkService)) - linkGroup.GET("/:linkId", handlers.NewShortlinkResolveHandler(linkService)) - - userGroup := r.Group("/user") - userGroup.POST("/create", handlers.NewUserCreateHandler(userService)) - userGroup.POST("/login", handlers.NewUserLoginHandler(userService)) - - dummyGroup := r.Group("/dummy") - { - dummyGroup.Use(middleware.NewAuthMiddleware(userService)) - dummyGroup.GET("", handlers.NewDummyHandler()) - } - if args.GetProfilePath() != "" { pprofFile, err := os.Create(args.GetProfilePath()) if err != nil { @@ -177,22 +147,14 @@ func main() { }() } - listenAddr := fmt.Sprintf(":%d", conf.GetPort()) - logger.Log().Msgf("server listening on %s", listenAddr) - - listener, err := (&net.ListenConfig{}).Listen(ctx, "tcp", listenAddr) - if err != nil { - logger.Fatal().Err(err).Msg("can not create network listener") - } - - go func() { - <-ctx.Done() - logger.Log().Msg("stopping tcp listener...") - listener.Close() - }() - - err = r.RunListener(listener) - if err != nil && err == net.ErrClosed { - logger.Fatal().Err(err).Msg("server stopped with error") - } + srv := server.New( + server.NewServerOpts{ + DebugMode: debugMode, + Logger: logger, + Notifier: clientNotifier, + ShortlinkService: linkService, + UserService: userService, + }, + ) + srv.Run(ctx, conf.GetPort()) } diff --git a/src/server/server.go b/src/server/server.go new file mode 100644 index 0000000..189a2fc --- /dev/null +++ b/src/server/server.go @@ -0,0 +1,81 @@ +package server + +import ( + "backend/src/client_notifier" + "backend/src/core/services" + "backend/src/logger" + "backend/src/server/handlers" + "backend/src/server/middleware" + "context" + "fmt" + "net" + + "github.com/gin-gonic/gin" +) + +type Server struct { + logger logger.Logger + ginEngine *gin.Engine +} + +type NewServerOpts struct { + DebugMode bool + Logger logger.Logger + Notifier client_notifier.ClientNotifier + UserService services.UserService + ShortlinkService services.ShortlinkService +} + +func New(opts NewServerOpts) *Server { + if !opts.DebugMode { + gin.SetMode(gin.ReleaseMode) + } + + r := gin.New() + r.Use(middleware.NewRequestLogMiddleware(opts.Logger)) + r.Use(gin.Recovery()) + + r.Static("/webapp", "./webapp") + + r.GET("/pooling", handlers.NewLongPoolingHandler(opts.Notifier)) + + linkGroup := r.Group("/s") + linkGroup.POST("/new", handlers.NewShortlinkCreateHandler(opts.ShortlinkService)) + linkGroup.GET("/:linkId", handlers.NewShortlinkResolveHandler(opts.ShortlinkService)) + + userGroup := r.Group("/user") + userGroup.POST("/create", handlers.NewUserCreateHandler(opts.UserService)) + userGroup.POST("/login", handlers.NewUserLoginHandler(opts.UserService)) + + dummyGroup := r.Group("/dummy") + { + dummyGroup.Use(middleware.NewAuthMiddleware(opts.UserService)) + dummyGroup.GET("", handlers.NewDummyHandler()) + } + + return &Server{ + logger: opts.Logger, + ginEngine: r, + } +} + +func (s *Server) Run(ctx context.Context, port uint16) { + listenAddr := fmt.Sprintf(":%d", port) + s.logger.Log().Msgf("server listening on %s", listenAddr) + + listener, err := (&net.ListenConfig{}).Listen(ctx, "tcp", listenAddr) + if err != nil { + s.logger.Fatal().Err(err).Msg("can not create network listener") + } + + go func() { + <-ctx.Done() + s.logger.Log().Msg("stopping tcp listener...") + listener.Close() + }() + + err = s.ginEngine.RunListener(listener) + if err != nil && err == net.ErrClosed { + s.logger.Fatal().Err(err).Msg("server stopped with error") + } +}