183 lines
5.8 KiB
Markdown
183 lines
5.8 KiB
Markdown
# DeDi Registry Plugin
|
|
|
|
A **registry type plugin** for Beckn-ONIX that integrates with DeDi (Decentralized Digital Infrastructure) registry services.
|
|
|
|
## Overview
|
|
|
|
The DeDi Registry plugin is a **registry implementation** that enables Beckn-ONIX to lookup participant records from remote DeDi registries via REST API calls.
|
|
|
|
## Configuration
|
|
|
|
```yaml
|
|
plugins:
|
|
registry:
|
|
id: dediregistry
|
|
config:
|
|
baseURL: "https://dedi-api.example.com"
|
|
apiKey: "your-bearer-token"
|
|
namespaceID: "76EU8BF1gzRGGatgw7wZZb7nEVx77XSwkKDv4UDLdxh8ztty4zmbYU"
|
|
registryName: "dedi_registry"
|
|
timeout: "30" # seconds
|
|
```
|
|
|
|
### Configuration Parameters
|
|
|
|
| Parameter | Required | Description | Default |
|
|
|-----------|----------|-------------|---------|
|
|
| `baseURL` | Yes | DeDi registry API base URL | - |
|
|
| `apiKey` | Yes | Bearer token for API authentication | - |
|
|
| `namespaceID` | Yes | DeDi namespace identifier | - |
|
|
| `registryName` | Yes | Registry name to query | - |
|
|
| `timeout` | No | Request timeout in seconds | 30 |
|
|
|
|
## Usage
|
|
|
|
### In Module Configuration
|
|
|
|
```yaml
|
|
modules:
|
|
- name: bapTxnReceiver
|
|
handler:
|
|
plugins:
|
|
registry:
|
|
id: dediregistry
|
|
config:
|
|
baseURL: "https://dedi-registry.example.com"
|
|
apiKey: "your-api-key"
|
|
namespaceID: "beckn-network"
|
|
registryName: "participants"
|
|
```
|
|
|
|
### In Code
|
|
|
|
```go
|
|
// Load DeDi registry plugin (same as any registry plugin)
|
|
dediRegistry, err := manager.Registry(ctx, &plugin.Config{
|
|
ID: "dediregistry", // Plugin ID specifies DeDi implementation
|
|
Config: map[string]string{
|
|
"baseURL": "https://dedi-registry.example.com",
|
|
"apiKey": "your-api-key",
|
|
"namespaceID": "beckn-network",
|
|
"registryName": "participants",
|
|
},
|
|
})
|
|
|
|
// Lookup participant with dynamic subscriber ID (from request context)
|
|
subscription := &model.Subscription{
|
|
Subscriber: model.Subscriber{
|
|
SubscriberID: "bap-network", // Extracted from Authorization header or request body
|
|
},
|
|
}
|
|
results, err := dediRegistry.Lookup(ctx, subscription)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Extract public key from result (standard Beckn format)
|
|
if len(results) > 0 {
|
|
publicKey := results[0].SigningPublicKey
|
|
subscriberID := results[0].SubscriberID
|
|
}
|
|
```
|
|
|
|
## API Integration
|
|
|
|
### DeDi API URL Pattern
|
|
```
|
|
{baseURL}/dedi/lookup/{namespaceID}/{registryName}/{subscriberID}
|
|
```
|
|
|
|
**Example**: `https://dedi-api.com/dedi/lookup/76EU8BF1gzRGGatgw7wZZb7nEVx77XSwkKDv4UDLdxh8ztty4zmbYU/dedi_registry/bap-network`
|
|
|
|
### Authentication
|
|
```
|
|
Authorization: Bearer {apiKey}
|
|
```
|
|
|
|
### Expected DeDi Response Format
|
|
|
|
```json
|
|
{
|
|
"message": "Resource retrieved successfully",
|
|
"data": {
|
|
"namespace": "dediregistry",
|
|
"namespace_id": "76EU8BF1gzRGGatgw7wZZb7nEVx77XSwkKDv4UDLdxh8ztty4zmbYU",
|
|
"registry_name": "dedi_registry",
|
|
"record_name": "bap-network",
|
|
"details": {
|
|
"key_id": "b692d295-5425-40f5-af77-d62646841dca",
|
|
"signing_public_key": "YK3Xqc83Bpobc1UT0ObAe6mBJMiAOkceIsNtmph9WTc=",
|
|
"encr_public_key": "YK3Xqc83Bpobc1UT0ObAe6mBJMiAOkceIsNtmph9WTc=",
|
|
"status": "SUBSCRIBED",
|
|
"created": "2024-01-15T10:00:00Z",
|
|
"updated": "2024-01-15T10:00:00Z",
|
|
"valid_from": "2024-01-01T00:00:00Z",
|
|
"valid_until": "2025-12-31T23:59:59Z"
|
|
},
|
|
"state": "live",
|
|
"created_at": "2025-10-09T06:09:48.295Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Field Mapping to Beckn Subscription
|
|
|
|
| DeDi Field | Beckn Field | Description |
|
|
|------------|-------------|-------------|
|
|
| `data.record_name` | `subscriber_id` | Participant identifier |
|
|
| `data.details.key_id` | `key_id` | Unique key identifier |
|
|
| `data.details.signing_public_key` | `signing_public_key` | Public key for signature verification |
|
|
| `data.details.encr_public_key` | `encr_public_key` | Public key for encryption |
|
|
| `data.details.status` | `status` | Subscription status |
|
|
| `data.details.created` | `created` | Creation timestamp |
|
|
| `data.details.updated` | `updated` | Last update timestamp |
|
|
| `data.details.valid_from` | `valid_from` | Key validity start |
|
|
| `data.details.valid_until` | `valid_until` | Key validity end |
|
|
|
|
### Lookup Flow
|
|
|
|
1. **Request Processing**: Plugin extracts `subscriber_id` from incoming request
|
|
2. **API Call**: Makes GET request to DeDi API with static config + dynamic subscriber ID
|
|
3. **Response Parsing**: Extracts data from `data.details` object
|
|
4. **Format Conversion**: Maps DeDi fields to Beckn Subscription format
|
|
5. **Return**: Returns array of Subscription objects
|
|
|
|
## Testing
|
|
|
|
Run plugin tests:
|
|
|
|
```bash
|
|
go test ./pkg/plugin/implementation/dediregistry -v
|
|
```
|
|
|
|
Test coverage includes:
|
|
- Configuration validation
|
|
- Successful API responses
|
|
- HTTP error handling
|
|
- Network failures
|
|
- Invalid JSON responses
|
|
- Missing required fields
|
|
|
|
## Dependencies
|
|
|
|
- `github.com/hashicorp/go-retryablehttp`: HTTP client with retry logic
|
|
- Standard Go libraries for HTTP and JSON handling
|
|
|
|
## Error Handling
|
|
|
|
- **Configuration Errors**: Missing required config parameters
|
|
- **Network Errors**: Connection failures, timeouts
|
|
- **HTTP Errors**: Non-200 status codes from DeDi API
|
|
- **Data Errors**: Missing required fields in response
|
|
- **Validation Errors**: Empty subscriber ID in request
|
|
|
|
|
|
### Integration Notes
|
|
|
|
- **Plugin Type**: Registry implementation
|
|
- **Interface**: Implements `RegistryLookup` interface with `Lookup(ctx, *model.Subscription) ([]model.Subscription, error)`
|
|
- **Manager Access**: Available via `manager.Registry()` method (same as standard registry)
|
|
- **Dynamic Lookup**: Uses `req.SubscriberID` from request context, not static configuration
|
|
- **Data Conversion**: Automatically converts DeDi API format to Beckn Subscription format
|
|
- **Build Integration**: Included in `build-plugins.sh`, compiles to `dediregistry.so`
|
|
- **Usage Pattern**: Configure with `id: dediregistry` in registry plugin configuration |