package http import ( "codeword/internal/controller/promocode" "codeword/internal/controller/recovery" "context" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) 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.RecoveryController.HandlePingDB) 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) s.app.Post("/promocode/fastlink", s.PromoCodeController.CreateFastLink) s.app.Get("/promocode/stats", s.PromoCodeController.GetAllStats) //... other } func (s *Server) handleLiveness(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusOK) }