Files
go-sip/internal/contract/event_mq.go
T

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
}