moved server initialization

This commit is contained in:
Sergey Chubaryan 2024-08-18 21:16:07 +03:00
parent 278ef8c991
commit f9ef25b285
2 changed files with 92 additions and 49 deletions

60
main.go
View File

@ -9,22 +9,18 @@ import (
"backend/src/core/services" "backend/src/core/services"
"backend/src/core/utils" "backend/src/core/utils"
"backend/src/logger" "backend/src/logger"
"backend/src/server/handlers" "backend/src/server"
"backend/src/server/middleware"
"context" "context"
"crypto/rsa" "crypto/rsa"
"crypto/x509" "crypto/x509"
"database/sql" "database/sql"
"encoding/pem" "encoding/pem"
"fmt"
"net"
"os" "os"
"os/signal" "os/signal"
"runtime/pprof" "runtime/pprof"
"syscall" "syscall"
"time" "time"
"github.com/gin-gonic/gin"
"github.com/jackc/pgx" "github.com/jackc/pgx"
"github.com/jackc/pgx/stdlib" "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() != "" { if args.GetProfilePath() != "" {
pprofFile, err := os.Create(args.GetProfilePath()) pprofFile, err := os.Create(args.GetProfilePath())
if err != nil { if err != nil {
@ -177,22 +147,14 @@ func main() {
}() }()
} }
listenAddr := fmt.Sprintf(":%d", conf.GetPort()) srv := server.New(
logger.Log().Msgf("server listening on %s", listenAddr) server.NewServerOpts{
DebugMode: debugMode,
listener, err := (&net.ListenConfig{}).Listen(ctx, "tcp", listenAddr) Logger: logger,
if err != nil { Notifier: clientNotifier,
logger.Fatal().Err(err).Msg("can not create network listener") ShortlinkService: linkService,
} UserService: userService,
},
go func() { )
<-ctx.Done() srv.Run(ctx, conf.GetPort())
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")
}
} }

81
src/server/server.go Normal file
View File

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