39 lines
1.1 KiB
Go
39 lines
1.1 KiB
Go
package contract
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// MarshalMQ constructs the Dispatcher-owned external event envelope. Internal
|
|
// Agent event frames do not supply the Dispatcher identity or select a version.
|
|
func (b EventBuilder) MarshalMQ(dispatcherID string, now time.Time, eventID string) ([]byte, error) {
|
|
if err := ValidateTenantKey(b.TenantKey); err != nil {
|
|
return nil, err
|
|
}
|
|
if b.Version < 1 {
|
|
return nil, fmt.Errorf("aggregate version must be positive")
|
|
}
|
|
envelope := struct {
|
|
EventEnvelope
|
|
DispatcherID string `json:"dispatcher_id"`
|
|
}{EventEnvelope: EventEnvelope{
|
|
SchemaVersion: "2.0", EventID: eventID, EventType: b.EventType,
|
|
TenantID: b.TenantID, TenantKey: b.TenantKey, TraceID: b.TraceID,
|
|
OccurredAt: now.UTC().Format(time.RFC3339Nano), AggregateType: b.Aggregate,
|
|
AggregateID: b.AggregateID, AggregateVersion: b.Version, Payload: b.Payload,
|
|
}, DispatcherID: dispatcherID}
|
|
raw, err := json.Marshal(envelope)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := ValidateMQMessage(raw); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := ValidateEvent(raw); err != nil {
|
|
return nil, err
|
|
}
|
|
return raw, nil
|
|
}
|