verification/internal/server/http.go

84 lines
1.6 KiB
Go

package server
import (
"context"
"fmt"
"github.com/gofiber/contrib/fiberzap"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/themakers/hlog"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/penahub_common/log_mw"
)
type ServerConfig struct {
Logger *zap.Logger
Controllers []Controller
HLogger hlog.Logger
}
type Server struct {
Logger *zap.Logger
Controllers []Controller
app *fiber.App
}
func NewHTTP(cfg ServerConfig) *Server {
srv := fiber.New(fiber.Config{
AppName: "Verification",
ErrorHandler: fiber.DefaultErrorHandler,
BodyLimit: 50 << 20,
})
srv.Use(
recover.New(recover.Config{EnableStackTrace: true}),
fiberzap.New(fiberzap.Config{Logger: cfg.Logger}),
LocalJwt(),
Jwt(),
log_mw.ContextLogger(cfg.HLogger),
)
s := &Server{
Logger: cfg.Logger,
Controllers: cfg.Controllers,
app: srv,
}
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() {
for _, c := range s.Controllers {
router := s.app.Group(c.Name())
c.Register(router)
}
}
type Controller interface {
Register(router fiber.Router)
Name() string
}
func (s *Server) ListRoutes() {
fmt.Println("Registered routes:")
for _, stack := range s.app.Stack() {
for _, route := range stack {
fmt.Printf("%s %s\n", route.Method, route.Path)
}
}
}