1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package server
- import (
- "time"
- "github.com/gin-gonic/gin"
- "github.com/sirupsen/logrus"
- )
- type ServerConfig struct {
- AllowedOrigins []string
- RequestTimeout time.Duration
- }
- type ServiceHandler interface {
- SetupRoutes(r *gin.Engine)
- Close() error
- }
- type Server struct {
- router *gin.Engine
- logger *logrus.Logger
- config ServerConfig
- handlers []*ServiceHandler
- }
- func NewGinServer(logger *logrus.Logger, config *Config) (*Server, error) {
- if logger == nil {
- return nil, NewError("initialize", ErrInvalidConfig, "logger is required")
- }
- // Set Gin mode to release
- gin.SetMode(gin.ReleaseMode)
- // Initialize router
- router := gin.New()
- server := &Server{
- router: router,
- logger: logger,
- config: config.ToServerConfig(),
- }
- // Add middleware in specific order
- router.Use(server.recoveryMiddleware())
- router.Use(server.requestIDMiddleware())
- router.Use(server.loggerMiddleware())
- router.Use(server.corsMiddleware())
- router.Use(server.errorHandlerMiddleware())
- return server, nil
- }
- func (s *Server) Router() *gin.Engine {
- return s.router
- }
- func (s *Server) Run() error {
- if err := s.router.Run(); err != nil {
- return NewError("run", ErrServerStartFailed, err.Error())
- }
- return nil
- }
- func (s *Server) Close() error {
- return nil
- }
- func (s *Server) SetupRoutes() {
- if len(s.handlers) == 0 {
- s.logger.Warn("no handlers registered")
- return
- }
- for _, h := range s.handlers {
- if h == nil {
- s.logger.Error("nil handler found")
- continue
- }
- (*h).SetupRoutes(s.router)
- }
- }
- // AddHealthCheck adds a basic health check endpoint
- func (s *Server) AddHealthCheck() {
- s.router.GET("/health", func(c *gin.Context) {
- c.JSON(200, gin.H{
- "status": "ok",
- "time": time.Now().UTC(),
- })
- })
- }
|