47 lines
2.4 KiB
Go
47 lines
2.4 KiB
Go
package transport
|
|
|
|
import (
|
|
"time"
|
|
|
|
pb "git.sendico.io/tech/sxchnge/notifications/interface/notifications/v1"
|
|
"git.sendico.io/tech/sxchnge/notifications/model"
|
|
merrors "git.sendico.io/tech/sxchnge/shared/errors"
|
|
"google.golang.org/protobuf/types/known/timestamppb"
|
|
)
|
|
|
|
func request(r *pb.SendRequest) (model.Request, error) {
|
|
if r == nil || len(r.Targets) != 1 {
|
|
return model.Request{}, merrors.InvalidArgument("exactly one email target is required")
|
|
}
|
|
target := r.Targets[0]
|
|
if target == nil || target.Destination == nil {
|
|
return model.Request{}, merrors.InvalidArgument("missing destination")
|
|
}
|
|
email, ok := target.Destination.(*pb.Target_Email)
|
|
if !ok {
|
|
return model.Request{}, merrors.NotImplemented("channel is not implemented")
|
|
}
|
|
if email.Email == nil {
|
|
return model.Request{}, merrors.InvalidArgument("missing email target")
|
|
}
|
|
var expiry time.Time
|
|
if r.ExpiresAt != nil {
|
|
if err := r.ExpiresAt.CheckValid(); err != nil {
|
|
return model.Request{}, merrors.InvalidArgument("invalid expiry")
|
|
}
|
|
expiry = r.ExpiresAt.AsTime()
|
|
}
|
|
return model.Request{Key: r.IdempotencyKey, UserID: r.UserId, TemplateID: r.TemplateId, TemplateVersion: r.TemplateVersion, Parameters: r.Parameters, Locale: r.Locale, Address: email.Email.Address, ExpiresAt: expiry}, nil
|
|
}
|
|
func response(n *model.Notification) *pb.Notification {
|
|
states := map[model.State]pb.DeliveryState{model.Queued: pb.DeliveryState_DELIVERY_STATE_QUEUED, model.Sending: pb.DeliveryState_DELIVERY_STATE_SENDING, model.RetryWait: pb.DeliveryState_DELIVERY_STATE_RETRY_WAIT, model.Accepted: pb.DeliveryState_DELIVERY_STATE_ACCEPTED, model.Failed: pb.DeliveryState_DELIVERY_STATE_FAILED, model.Expired: pb.DeliveryState_DELIVERY_STATE_EXPIRED, model.Unknown: pb.DeliveryState_DELIVERY_STATE_UNKNOWN}
|
|
d := &pb.Delivery{Id: n.ID.Hex() + "-email", Channel: pb.Channel_CHANNEL_EMAIL, State: states[n.State], AttemptCount: n.Attempts, UpdatedAt: timestamppb.New(n.UpdatedAt)}
|
|
if n.FailureCode != "" {
|
|
d.Failure = &pb.Failure{Code: n.FailureCode, Message: "See the documented delivery failure code."}
|
|
}
|
|
if n.State == model.Queued || n.State == model.RetryWait {
|
|
d.NextAttemptAt = timestamppb.New(n.NextAttemptAt)
|
|
}
|
|
return &pb.Notification{Id: n.ID.Hex(), UserId: n.UserID, TemplateId: n.TemplateID, TemplateVersion: n.TemplateVersion, Deliveries: []*pb.Delivery{d}, CreatedAt: timestamppb.New(n.CreatedAt), UpdatedAt: timestamppb.New(n.UpdatedAt), ExpiresAt: timestamppb.New(n.ExpiresAt)}
|
|
}
|