2023-06-12 14:19:10 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
2024-05-26 15:32:07 +00:00
|
|
|
"context"
|
|
|
|
"fmt"
|
2023-06-12 14:19:10 +00:00
|
|
|
"github.com/gofiber/contrib/fiberzap"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"github.com/gofiber/fiber/v2/middleware/recover"
|
2024-05-27 11:53:34 +00:00
|
|
|
"github.com/themakers/hlog"
|
2023-06-12 14:19:10 +00:00
|
|
|
"go.uber.org/zap"
|
|
|
|
)
|
|
|
|
|
2024-05-26 15:32:07 +00:00
|
|
|
type ServerConfig struct {
|
|
|
|
Logger *zap.Logger
|
|
|
|
Controllers []Controller
|
2024-05-27 11:53:34 +00:00
|
|
|
HLogger hlog.Logger
|
2023-06-12 14:19:10 +00:00
|
|
|
}
|
|
|
|
|
2024-05-26 15:32:07 +00:00
|
|
|
type Server struct {
|
|
|
|
Logger *zap.Logger
|
|
|
|
Controllers []Controller
|
|
|
|
app *fiber.App
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewHTTP(cfg ServerConfig) *Server {
|
2023-06-12 14:19:10 +00:00
|
|
|
srv := fiber.New(fiber.Config{
|
|
|
|
AppName: "Verification",
|
|
|
|
ErrorHandler: fiber.DefaultErrorHandler,
|
|
|
|
BodyLimit: 50 << 20,
|
|
|
|
})
|
|
|
|
|
|
|
|
srv.Use(
|
|
|
|
recover.New(recover.Config{EnableStackTrace: true}),
|
2024-05-26 15:32:07 +00:00
|
|
|
fiberzap.New(fiberzap.Config{Logger: cfg.Logger}),
|
2023-06-12 14:19:10 +00:00
|
|
|
LocalJwt(),
|
|
|
|
Jwt(),
|
2024-05-27 11:53:34 +00:00
|
|
|
ContextLogger(cfg.HLogger),
|
2023-06-12 14:19:10 +00:00
|
|
|
)
|
|
|
|
|
2024-05-26 15:32:07 +00:00
|
|
|
s := &Server{
|
|
|
|
Logger: cfg.Logger,
|
|
|
|
Controllers: cfg.Controllers,
|
|
|
|
app: srv,
|
|
|
|
}
|
|
|
|
|
|
|
|
s.registerRoutes()
|
|
|
|
|
|
|
|
return s
|
2023-06-12 14:19:10 +00:00
|
|
|
}
|
|
|
|
|
2024-05-26 15:32:07 +00:00
|
|
|
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
|
2023-06-12 14:19:10 +00:00
|
|
|
}
|
2024-05-26 15:32:07 +00:00
|
|
|
return nil
|
2023-06-12 14:19:10 +00:00
|
|
|
}
|
|
|
|
|
2024-05-26 15:32:07 +00:00
|
|
|
func (s *Server) Shutdown(ctx context.Context) error {
|
|
|
|
return s.app.Shutdown()
|
2023-06-12 14:19:10 +00:00
|
|
|
}
|
|
|
|
|
2024-05-26 15:32:07 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
2023-06-12 14:19:10 +00:00
|
|
|
}
|