102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
package messagingimp
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/tech/sendico/pkg/merrors"
|
|
gmessaging "github.com/tech/sendico/pkg/generated/gmessaging"
|
|
"github.com/tech/sendico/pkg/model"
|
|
"google.golang.org/protobuf/proto"
|
|
"google.golang.org/protobuf/types/known/timestamppb"
|
|
)
|
|
|
|
type EnvelopeImp struct {
|
|
uid uuid.UUID
|
|
dateTime time.Time
|
|
data []byte
|
|
sender string
|
|
signature model.NotificationEvent
|
|
}
|
|
|
|
func (e *EnvelopeImp) GetTimeStamp() time.Time {
|
|
return e.dateTime
|
|
}
|
|
|
|
func (e *EnvelopeImp) GetMessageId() uuid.UUID {
|
|
return e.uid
|
|
}
|
|
|
|
func (e *EnvelopeImp) GetSender() string {
|
|
return e.sender
|
|
}
|
|
|
|
func (e *EnvelopeImp) GetData() []byte {
|
|
return e.data
|
|
}
|
|
|
|
func (e *EnvelopeImp) GetSignature() model.NotificationEvent {
|
|
return e.signature
|
|
}
|
|
|
|
func (e *EnvelopeImp) Serialize() ([]byte, error) {
|
|
if e.data == nil {
|
|
return nil, merrors.Internal("Envelope data is not initialized")
|
|
}
|
|
msg := gmessaging.Envelope{
|
|
Event: &gmessaging.NotificationEvent{
|
|
Type: e.signature.StringType(),
|
|
Action: e.signature.StringAction(),
|
|
},
|
|
MessageData: e.data,
|
|
Metadata: &gmessaging.EventMetadata{
|
|
MessageId: e.uid.String(),
|
|
Sender: e.sender,
|
|
Timestamp: timestamppb.New(e.dateTime),
|
|
},
|
|
}
|
|
return proto.Marshal(&msg)
|
|
}
|
|
|
|
func (e *EnvelopeImp) Wrap(data []byte) ([]byte, error) {
|
|
e.data = data
|
|
return e.Serialize()
|
|
}
|
|
|
|
func DeserializeImp(data []byte) (*EnvelopeImp, error) {
|
|
var envelope gmessaging.Envelope
|
|
if err := proto.Unmarshal(data, &envelope); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var e EnvelopeImp
|
|
var err error
|
|
if e.uid, err = uuid.Parse(envelope.Metadata.MessageId); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if envelope.Metadata.Timestamp != nil {
|
|
e.dateTime = envelope.Metadata.Timestamp.AsTime()
|
|
} else {
|
|
e.dateTime = time.Now()
|
|
}
|
|
|
|
if e.signature, err = model.StringToNotificationEvent(envelope.Event.Type, envelope.Event.Action); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
e.data = envelope.MessageData
|
|
e.sender = envelope.Metadata.Sender
|
|
|
|
return &e, nil
|
|
}
|
|
|
|
func CreateEnvelopeImp(sender string, signature model.NotificationEvent) *EnvelopeImp {
|
|
return &EnvelopeImp{
|
|
dateTime: time.Now(),
|
|
sender: sender,
|
|
uid: uuid.New(),
|
|
signature: signature,
|
|
}
|
|
}
|