package server import ( "os" "os/signal" "time" "github.com/gofiber/fiber/v2" "github.com/jackc/pgx/v4/pgxpool" "github.com/streadway/amqp" discovery "git.pbiernat.dev/egommerce/go-api-pkg/consul" "git.pbiernat.dev/egommerce/go-api-pkg/fluentd" ) type Server struct { *fiber.App log *fluentd.Logger db *pgxpool.Pool ebCh *amqp.Channel discovery *discovery.Service name string addr string } type RequestID struct { RequestID string `reqHeader:"x-request-id"` } func NewServer(conf *Config, logger *fluentd.Logger, db *pgxpool.Pool, ebCh *amqp.Channel) *Server { discovery, err := discovery.NewService(conf.RegistryAddr, conf.AppName, conf.AppDomain, conf.Port) if err != nil { logger.Log("Error connecting to %s: %v", conf.RegistryAddr, err) } logger.Log("Registering service with name: %s, address: %s", discovery.Name, discovery.Address) err = discovery.Register() if err != nil { logger.Log(err.Error()) } cnf := fiber.Config{ AppName: conf.AppName, ServerHeader: conf.AppDomain, ReadTimeout: time.Millisecond * 50, WriteTimeout: time.Millisecond * 50, IdleTimeout: time.Millisecond * 50, } s := &Server{ fiber.New(cnf), logger, db, ebCh, discovery, conf.AppName, conf.NetAddr, } SetupMiddlewares(s) SetupRoutes(s) return s } func (s *Server) Start() { err := s.Listen(s.addr) s.log.Log("Starting error: %v", err) } func (s *Server) StartWithGracefulShutdown() { idle := make(chan struct{}) go func() { sigint := make(chan os.Signal, 1) signal.Notify(sigint, os.Interrupt) <-sigint if err := s.Shutdown(); err != nil { s.log.Log("Server is not shutting down! Reason: %v", err) } s.log.Log("Server is going down...") s.discovery.Unregister() close(idle) }() if err := s.Listen(s.addr); err != nil { s.log.Log("Server is not running! Reason: %v", err) } <-idle } func (s *Server) GetRequestID(c *fiber.Ctx) (string, error) { var hdr = new(RequestID) if err := c.ReqHeaderParser(hdr); err != nil { return "", err } return hdr.RequestID, nil }