package middleware import ( "log" "github.com/gofiber/fiber/v2" ) // ErrorHandler is a global error handler middleware func ErrorHandler(c *fiber.Ctx) error { // Call next middleware/handler err := c.Next() // If no error, return if err == nil { return nil } // Log error with context log.Printf("Error: %v | Method: %s | Path: %s | IP: %s", err, c.Method(), c.Path(), c.IP(), ) // Check if error is a Fiber error code := fiber.StatusInternalServerError message := "Internal Server Error" if e, ok := err.(*fiber.Error); ok { code = e.Code message = e.Message } // Return structured error response return c.Status(code).JSON(fiber.Map{ "success": false, "error": message, }) } // RecoverHandler recovers from panics and returns a proper error response func RecoverHandler() fiber.Handler { return func(c *fiber.Ctx) error { defer func() { if r := recover(); r != nil { // Log panic with context log.Printf("Panic recovered: %v | Method: %s | Path: %s | IP: %s", r, c.Method(), c.Path(), c.IP(), ) // Return error response c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "error": "Internal Server Error", }) } }() return c.Next() } }