Files
sablier/internal/server/server.go
Alexis Couvreur fca9c79289 refactor: reorganize code structure (#556)
* refactor: rename providers to Provider

* refactor folders

* fix build cmd

* fix build cmd

* fix build cmd

* fix cmd start
2025-03-10 14:11:40 -04:00

70 lines
1.5 KiB
Go

package server
import (
"context"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/sablierapp/sablier/internal/api"
"github.com/sablierapp/sablier/pkg/config"
"log/slog"
"net/http"
"time"
)
func setupRouter(ctx context.Context, logger *slog.Logger, serverConf config.Server, s *api.ServeStrategy) *gin.Engine {
r := gin.New()
r.Use(StructuredLogger(logger))
r.Use(gin.Recovery())
registerRoutes(ctx, r, serverConf, s)
return r
}
func Start(ctx context.Context, logger *slog.Logger, serverConf config.Server, s *api.ServeStrategy) {
start := time.Now()
if logger.Enabled(ctx, slog.LevelDebug) {
gin.SetMode(gin.DebugMode)
} else {
gin.SetMode(gin.ReleaseMode)
}
r := setupRouter(ctx, logger, serverConf, s)
var server *http.Server
server = &http.Server{
Addr: fmt.Sprintf(":%d", serverConf.Port),
Handler: r,
}
logger.Info("starting ",
slog.String("listen", server.Addr),
slog.Duration("startup", time.Since(start)),
slog.String("mode", gin.Mode()),
)
go StartHttp(server, logger)
// Graceful web server shutdown.
<-ctx.Done()
logger.Info("server: shutting down")
err := server.Close()
if err != nil {
logger.Error("server: shutdown failed", slog.Any("error", err))
}
}
// StartHttp starts the Web server in http mode.
func StartHttp(s *http.Server, logger *slog.Logger) {
if err := s.ListenAndServe(); err != nil {
if errors.Is(err, http.ErrServerClosed) {
logger.Info("server: shutdown complete")
} else {
logger.Error("server failed to start", slog.Any("error", err))
}
}
}