package middleware import ( "crypto/rand" "encoding/hex" "hfb_sys/backend/internal/logging" "github.com/gin-gonic/gin" ) const ( RequestIDHeader = "X-Request-ID" ContextRequestID = "request_id" ) func RequestID() gin.HandlerFunc { return func(c *gin.Context) { requestID := c.GetHeader(RequestIDHeader) if requestID == "" { requestID = newRequestID() } c.Set(ContextRequestID, requestID) c.Writer.Header().Set(RequestIDHeader, requestID) c.Request = c.Request.WithContext(logging.WithRequestID(c.Request.Context(), requestID)) c.Next() } } func GetRequestID(c *gin.Context) string { value, ok := c.Get(ContextRequestID) if !ok { return "" } requestID, ok := value.(string) if !ok { return "" } return requestID } func newRequestID() string { buf := make([]byte, 16) if _, err := rand.Read(buf); err != nil { return "" } return hex.EncodeToString(buf) }