From ab31e13e81f84fb4f4fe33c94a795a0bc84f6f1c Mon Sep 17 00:00:00 2001 From: ameersohel45 Date: Tue, 18 Nov 2025 02:43:04 +0530 Subject: [PATCH 1/2] Issue 554 - refactor: improve error response format --- .../schemav2validator/schemav2validator.go | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/pkg/plugin/implementation/schemav2validator/schemav2validator.go b/pkg/plugin/implementation/schemav2validator/schemav2validator.go index d089717..cc6c717 100644 --- a/pkg/plugin/implementation/schemav2validator/schemav2validator.go +++ b/pkg/plugin/implementation/schemav2validator/schemav2validator.go @@ -112,7 +112,6 @@ func (v *schemav2Validator) Validate(ctx context.Context, reqURL *url.URL, data opts := []openapi3.SchemaValidationOption{ openapi3.VisitAsRequest(), - openapi3.MultiErrors(), openapi3.EnableFormatValidation(), } if err := schema.Value.VisitJSON(jsonData, opts...); err != nil { @@ -233,21 +232,39 @@ func (v *schemav2Validator) formatValidationError(err error) error { // extractSchemaErrors recursively extracts detailed error information from SchemaError. func (v *schemav2Validator) extractSchemaErrors(err error, schemaErrors *[]model.Error) { if schemaErr, ok := err.(*openapi3.SchemaError); ok { - // If there's an origin error, recursively extract from it - if schemaErr.Origin != nil { - v.extractSchemaErrors(schemaErr.Origin, schemaErrors) - } else { - // Leaf error - extract the actual validation failure - pathParts := schemaErr.JSONPointer() - path := strings.Join(pathParts, "/") - if path == "" { - path = schemaErr.SchemaField - } - *schemaErrors = append(*schemaErrors, model.Error{ - Paths: path, - Message: schemaErr.Reason, - }) + // Extract path from current error and message from Origin if available + pathParts := schemaErr.JSONPointer() + path := strings.Join(pathParts, "/") + if path == "" { + path = schemaErr.SchemaField } + + message := schemaErr.Reason + if schemaErr.Origin != nil { + originMsg := schemaErr.Origin.Error() + // Extract specific field error from nested message + if strings.Contains(originMsg, "Error at \"/") { + // Find last "Error at" which has the specific field error + parts := strings.Split(originMsg, "Error at \"") + if len(parts) > 1 { + lastPart := parts[len(parts)-1] + // Extract field path and update both path and message + if idx := strings.Index(lastPart, "\":"); idx > 0 { + fieldPath := lastPart[:idx] + fieldMsg := strings.TrimSpace(lastPart[idx+2:]) + path = strings.TrimPrefix(fieldPath, "/") + message = fieldMsg + } + } + } else { + message = originMsg + } + } + + *schemaErrors = append(*schemaErrors, model.Error{ + Paths: path, + Message: message, + }) } else if multiErr, ok := err.(openapi3.MultiError); ok { // Nested MultiError for _, e := range multiErr { From 4e69f5a106a065a3ad2f566070c25f3a90cceced Mon Sep 17 00:00:00 2001 From: ameersohel45 Date: Tue, 18 Nov 2025 14:56:56 +0530 Subject: [PATCH 2/2] Issue 553 - add : Add schemav2validator plugin documentation and configuration examples --- CONFIG.md | 41 ++++++++++++++++++++++++++++++++++++----- README.md | 9 ++++++--- SETUP.md | 22 ++++++++++++++++++++++ 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 6a221e2..991eb43 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -479,7 +479,38 @@ schemaValidator: --- -#### 5. Sign Validator Plugin +#### 5. Schema2Validator Plugin + +**Purpose**: Validate requests against OpenAPI 3.x specifications with action-based matching. + +```yaml +schemaValidator: + id: schemav2validator + config: + type: url + location: https://raw.githubusercontent.com/beckn/protocol-specifications-new/refs/heads/draft/api-specs/beckn-protocol-api.yaml + cacheTTL: "3600" +``` + +**Or for local files:** + +```yaml +schemaValidator: + id: schemav2validator + config: + type: file + location: ./validation-scripts/l2-config/mobility_1.1.0_openapi_3.1.yaml + cacheTTL: "3600" +``` + +**Parameters**: +- `type`: Source type - `"url"` for remote specs, `"file"` for local files +- `location`: URL or file path to OpenAPI 3.1 specification +- `cacheTTL`: Cache TTL in seconds before reloading spec (default: `"3600"`) + +--- + +#### 6. Sign Validator Plugin **Purpose**: Validate Ed25519 digital signatures on incoming requests. @@ -492,7 +523,7 @@ signValidator: --- -#### 6. Router Plugin +#### 7. Router Plugin **Purpose**: Determine routing destination based on rules. @@ -517,7 +548,7 @@ router: --- -#### 7. Signer Plugin +#### 8. Signer Plugin **Purpose**: Sign outgoing requests with Ed25519 signature. @@ -530,7 +561,7 @@ signer: --- -#### 8. Publisher Plugin +#### 9. Publisher Plugin **Purpose**: Publish messages to RabbitMQ or Pub/Sub for asynchronous processing. @@ -548,7 +579,7 @@ publisher: --- -#### 9. Middleware Plugin +#### 10. Middleware Plugin **Purpose**: Request preprocessing like UUID generation and header manipulation. diff --git a/README.md b/README.md index a24e40f..b524d58 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,8 @@ The **Beckn Protocol** is an open protocol that enables location-aware, local co - **Router**: YAML-based routing rules engine for request forwarding - **Signer**: Ed25519 digital signature creation for outgoing requests - **SignValidator**: Ed25519 signature validation for incoming requests -- **SchemaValidator**: JSON schema validation +- **SchemaValidator**: JSON schema validation +- **Schemav2Validator**: OpenAPI 3.x schema validation with action-based matching - **KeyManager**: HashiCorp Vault integration for production key management - **SimpleKeyManager**: Embedded key management for local development (no external dependencies) - **Publisher**: RabbitMQ message publishing for asynchronous processing @@ -305,9 +306,11 @@ modules: config: routingConfig: ./config/routing.yaml schemaValidator: - id: schemavalidator + id: schemavalidator # or schemav2validator config: - schemaDir: ./schemas + schemaDir: ./schemas # for schemavalidator + # type: url # for schemav2validator + # location: https://example.com/spec.yaml steps: - validateSign - addRoute diff --git a/SETUP.md b/SETUP.md index 9ca0447..fb563a4 100644 --- a/SETUP.md +++ b/SETUP.md @@ -830,6 +830,28 @@ schemaValidator: schemaURL: https://schemas.beckn.org ``` +#### Schema2Validator Plugin + +**Remote URL Configuration:** +```yaml +schemaValidator: + id: schemav2validator + config: + type: url + location: https://raw.githubusercontent.com/beckn/protocol-specifications-new/refs/heads/draft/api-specs/beckn-protocol-api.yaml + cacheTTL: "3600" +``` + +**Local File Configuration:** +```yaml +schemaValidator: + id: schemav2validator + config: + type: file + location: ./schemas/beckn-protocol-api.yaml + cacheTTL: "3600" +``` + #### Router Plugin ```yaml router: