package middleware import ( "context" "net/http" "music-server/internal/logging" "github.com/danielgtaylor/huma/v2" "github.com/google/uuid" "go.uber.org/zap" ) // QueueHeader carries the client's queue ID in requests and responses. const QueueHeader = "X-Queue-Id" type queueKey struct{} // QueueID returns the queue ID resolved by Queue. func QueueID(ctx context.Context) uuid.UUID { id, _ := ctx.Value(queueKey{}).(uuid.UUID) return id } // Queue resolves the queue ID in the X-Queue-Id header with resolve, which starts a new queue // when the header is missing or the queue has ended. The ID is returned in the same header. func Queue(api huma.API, resolve func(context.Context, string) (uuid.UUID, error)) Middleware { return func(ctx huma.Context, next func(huma.Context)) { id, err := resolve(ctx.Context(), ctx.Header(QueueHeader)) if err != nil { logging.GetLogger().Error("Failed to resolve queue", zap.Error(err)) _ = huma.WriteErr(api, ctx, http.StatusInternalServerError, "Internal Server Error") return } ctx.SetHeader(QueueHeader, id.String()) next(huma.WithValue(ctx, queueKey{}, id)) } }