package http import ( "codeword/internal/controller/promocode" "codeword/internal/controller/recovery" "context" "fmt" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "time" ) type ServerConfig struct { Logger *zap.Logger RecoveryController *recovery.RecoveryController PromoCodeController *promocode.PromoCodeController } type Server struct { Logger *zap.Logger RecoveryController *recovery.RecoveryController PromoCodeController *promocode.PromoCodeController app *fiber.App } func NewServer(config ServerConfig) *Server { app := fiber.New() s := &Server{ Logger: config.Logger, RecoveryController: config.RecoveryController, PromoCodeController: config.PromoCodeController, app: app, } s.registerRoutes() return s } func (s *Server) Start(addr string) error { if err := s.app.Listen(addr); err != nil { s.Logger.Error("Failed to start server", zap.Error(err)) return err } return nil } func (s *Server) Shutdown(ctx context.Context) error { return s.app.Shutdown() } func (s *Server) registerRoutes() { s.app.Get("/liveness", s.handleLiveness) s.app.Get("/readiness", s.handleReadiness) s.app.Post("/recover", s.RecoveryController.HandleRecoveryRequest) s.app.Get("/recover/:sign", s.RecoveryController.HandleRecoveryLink) s.app.Post("/promocode/create", s.PromoCodeController.CreatePromoCode) s.app.Put("/promocode/edit", s.PromoCodeController.EditPromoCode) s.app.Post("/promocode/getList", s.PromoCodeController.GetList) s.app.Post("/promocode/activate", s.PromoCodeController.Activate) s.app.Delete("/promocode/:promocodeID", s.PromoCodeController.Delete) //... other } func (s *Server) handleLiveness(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusOK) } func (s *Server) handleReadiness(c *fiber.Ctx) error { startTime := time.Now() if err := s.RecoveryController.HandlePingDB(c); err != nil { s.Logger.Error("Failed to ping the database", zap.Error(err)) return c.Status(fiber.StatusServiceUnavailable).SendString("DB ping failed") } duration := time.Since(startTime) durationMillis := duration.Milliseconds() responseMessage := fmt.Sprintf("DB ping success - Time taken: %d ms", durationMillis) return c.Status(fiber.StatusOK).SendString(responseMessage) }