gin.go 1.7 KB

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