From ff72e0442856d0f49bd19b54215c3500166e28c3 Mon Sep 17 00:00:00 2001 From: Hein Date: Wed, 3 Dec 2025 11:59:58 +0200 Subject: [PATCH] Added meta operation. --- pkg/funcspec/function_api_test.go | 4 ++-- pkg/resolvespec/handler.go | 17 +++++++++++++++++ pkg/restheadspec/handler.go | 29 ++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/pkg/funcspec/function_api_test.go b/pkg/funcspec/function_api_test.go index fb700d4..8a6628c 100644 --- a/pkg/funcspec/function_api_test.go +++ b/pkg/funcspec/function_api_test.go @@ -784,7 +784,7 @@ func TestReplaceMetaVariables(t *testing.T) { userCtx := &security.UserContext{ UserID: 123, UserName: "testuser", - SessionID: "session-abc", + SessionID: "456", } metainfo := map[string]interface{}{ @@ -819,7 +819,7 @@ func TestReplaceMetaVariables(t *testing.T) { name: "Replace [rid_session]", sqlQuery: "SELECT * FROM sessions WHERE session_id = [rid_session]", expectedCheck: func(result string) bool { - return strings.Contains(result, "'session-abc'") + return strings.Contains(result, "456") }, }, } diff --git a/pkg/resolvespec/handler.go b/pkg/resolvespec/handler.go index 21e1aa5..b031464 100644 --- a/pkg/resolvespec/handler.go +++ b/pkg/resolvespec/handler.go @@ -151,6 +151,8 @@ func (h *Handler) Handle(w common.ResponseWriter, r common.Request, params map[s h.handleUpdate(ctx, w, id, req.ID, req.Data, req.Options) case "delete": h.handleDelete(ctx, w, id, req.Data) + case "meta": + h.handleMeta(ctx, w, schema, entity, model) default: logger.Error("Invalid operation: %s", req.Operation) h.sendError(w, http.StatusBadRequest, "invalid_operation", "Invalid operation", nil) @@ -188,6 +190,21 @@ func (h *Handler) HandleGet(w common.ResponseWriter, r common.Request, params ma h.sendResponse(w, metadata, nil) } +// handleMeta processes meta operation requests +func (h *Handler) handleMeta(ctx context.Context, w common.ResponseWriter, schema, entity string, model interface{}) { + // Capture panics and return error response + defer func() { + if err := recover(); err != nil { + h.handlePanic(w, "handleMeta", err) + } + }() + + logger.Info("Getting metadata for %s.%s via meta operation", schema, entity) + + metadata := h.generateMetadata(schema, entity, model) + h.sendResponse(w, metadata, nil) +} + func (h *Handler) handleRead(ctx context.Context, w common.ResponseWriter, id string, options common.RequestOptions) { // Capture panics and return error response defer func() { diff --git a/pkg/restheadspec/handler.go b/pkg/restheadspec/handler.go index 0c58ea6..5917b01 100644 --- a/pkg/restheadspec/handler.go +++ b/pkg/restheadspec/handler.go @@ -146,13 +146,25 @@ func (h *Handler) Handle(w common.ResponseWriter, r common.Request, params map[s h.handleRead(ctx, w, "", options) } case "POST": - // Create operation + // Read request body body, err := r.Body() if err != nil { logger.Error("Failed to read request body: %v", err) h.sendError(w, http.StatusBadRequest, "invalid_request", "Failed to read request body", err) return } + + // Try to detect if this is a meta operation request + var bodyMap map[string]interface{} + if err := json.Unmarshal(body, &bodyMap); err == nil { + if operation, ok := bodyMap["operation"].(string); ok && operation == "meta" { + logger.Info("Detected meta operation request for %s.%s", schema, entity) + h.handleMeta(ctx, w, schema, entity, model) + return + } + } + + // Not a meta operation, proceed with normal create/update var data interface{} if err := json.Unmarshal(body, &data); err != nil { logger.Error("Failed to decode request body: %v", err) @@ -229,6 +241,21 @@ func (h *Handler) HandleGet(w common.ResponseWriter, r common.Request, params ma h.sendResponse(w, metadata, nil) } +// handleMeta processes meta operation requests +func (h *Handler) handleMeta(ctx context.Context, w common.ResponseWriter, schema, entity string, model interface{}) { + // Capture panics and return error response + defer func() { + if err := recover(); err != nil { + h.handlePanic(w, "handleMeta", err) + } + }() + + logger.Info("Getting metadata for %s.%s via meta operation", schema, entity) + + metadata := h.generateMetadata(schema, entity, model) + h.sendResponse(w, metadata, nil) +} + // parseOptionsFromHeaders is now implemented in headers.go func (h *Handler) handleRead(ctx context.Context, w common.ResponseWriter, id string, options ExtendedRequestOptions) {