gin.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package server
  2. import (
  3. "time"
  4. "github.com/gin-gonic/gin"
  5. "github.com/sirupsen/logrus"
  6. )
  7. type ServerConfig struct {
  8. AllowedOrigins []string
  9. RequestTimeout time.Duration
  10. }
  11. type ServiceHandler interface {
  12. SetupRoutes(r *gin.Engine)
  13. Close() error
  14. }
  15. type Server struct {
  16. router *gin.Engine
  17. logger *logrus.Logger
  18. config ServerConfig
  19. handlers []*ServiceHandler
  20. }
  21. func NewGinServer(logger *logrus.Logger, config *Config) (*Server, error) {
  22. if logger == nil {
  23. return nil, NewError("initialize", ErrInvalidConfig, "logger is required")
  24. }
  25. // Set Gin mode to release
  26. gin.SetMode(gin.ReleaseMode)
  27. // Initialize router
  28. router := gin.New()
  29. server := &Server{
  30. router: router,
  31. logger: logger,
  32. config: config.ToServerConfig(),
  33. }
  34. // Add middleware in specific order
  35. router.Use(server.recoveryMiddleware())
  36. router.Use(server.requestIDMiddleware())
  37. router.Use(server.loggerMiddleware())
  38. router.Use(server.corsMiddleware())
  39. router.Use(server.errorHandlerMiddleware())
  40. return server, nil
  41. }
  42. func (s *Server) Router() *gin.Engine {
  43. return s.router
  44. }
  45. func (s *Server) Run() error {
  46. if err := s.router.Run(); err != nil {
  47. return NewError("run", ErrServerStartFailed, err.Error())
  48. }
  49. return nil
  50. }
  51. func (s *Server) Close() error {
  52. return nil
  53. }
  54. func (s *Server) SetupRoutes() {
  55. if len(s.handlers) == 0 {
  56. s.logger.Warn("no handlers registered")
  57. return
  58. }
  59. for _, h := range s.handlers {
  60. if h == nil {
  61. s.logger.Error("nil handler found")
  62. continue
  63. }
  64. (*h).SetupRoutes(s.router)
  65. }
  66. }
  67. // AddHealthCheck adds a basic health check endpoint
  68. func (s *Server) AddHealthCheck() {
  69. s.router.GET("/health", func(c *gin.Context) {
  70. c.JSON(200, gin.H{
  71. "status": "ok",
  72. "time": time.Now().UTC(),
  73. })
  74. })
  75. }