package http import ( controller "codeword/internal/controller/recovery" "codeword/internal/repository" "context" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) type ServerConfig struct { Logger *zap.Logger Repo *repository.UserRepository RecoveryController *controller.RecoveryController } type Server struct { Logger *zap.Logger Repo *repository.UserRepository RecoveryController *controller.RecoveryController app *fiber.App } func NewServer(config ServerConfig) *Server { app := fiber.New() s := &Server{ Logger: config.Logger, Repo: config.Repo, RecoveryController: config.RecoveryController, app: app, } s.registerRoutes() return s } 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) //... other } func (s *Server) handleLiveness(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusOK) } func (s *Server) handleReadiness(c *fiber.Ctx) error { if err := s.Repo.Ping(); err != nil { s.Logger.Error("Failed to ping the database", zap.Error(err)) return c.Status(fiber.StatusServiceUnavailable).SendString("DB ping failed") } return c.Status(fiber.StatusOK).SendString("42") } func (s *Server) Start(addr string) error { return s.app.Listen(addr) } func (s *Server) Shutdown(ctx context.Context) error { return s.app.Shutdown() }