package handlers import ( "cargo-erp-backend/internal/handlers/router/auth" "cargo-erp-backend/pkg/helpers" "fmt" "net/http" "time" "github.com/gin-gonic/gin" "go.uber.org/zap" ) type HandlersInfterface interface { Run() } type Handlers struct { Helper helpers.HelperInterface } func NewHandlers(helper helpers.HelperInterface) HandlersInfterface { return &Handlers{ Helper: helper, } } func (h *Handlers) ZapLoggerMiddleware(logger *zap.Logger) gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() path := c.Request.URL.Path query := c.Request.URL.RawQuery // Lanjutkan eksekusi ke handler utama c.Next() // Hitung durasi response eksekusi latency := time.Since(start) status := c.Writer.Status() // Siapkan field data log terstruktur fields := []zap.Field{ zap.Int("status", status), zap.String("method", c.Request.Method), zap.String("path", path), zap.String("query", query), zap.String("ip", c.ClientIP()), zap.Duration("latency", latency), zap.String("user-agent", c.Request.UserAgent()), } // Jika ada error internal dari Gin, masukkan ke log if len(c.Errors) > 0 { for _, e := range c.Errors.Errors() { logger.Error(e, fields...) } return } // Tentukan level log berdasarkan HTTP Status Code if status >= 500 { logger.Error("Server Error", fields...) } else if status >= 400 { logger.Warn("Client Error", fields...) } else { logger.Info("Request Success", fields...) } } } func (h *Handlers) Run() { host := fmt.Sprintf("%v", h.Helper.Config().Get("app.host")) port := fmt.Sprintf("%v", h.Helper.Config().Get("app.port")) r := gin.Default() r.Use(h.ZapLoggerMiddleware(h.Helper.Log())) r.Use(gin.Recovery()) r.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "pong", }) }) //auth auth.NewAuthHandler(h.Helper, r).Router() h.Helper.Log().Info("Starting Apps") r.Run(fmt.Sprintf("%v:%v", host, port)) }