Implement notifications service with shared messaging and email drivers (#36)

This commit is contained in:
Stephan D committed 2026-09-12 14:41:55 +02:00
1 parent 36277b6c45
commit 5c2d36281b
54 files changed
+3746 -6

No files matched your search

@@ -0,0 +1,49 @@
// Package runtime composes the locally owned Sendico durable messaging adapters.
// SXCHNGE does not include Sendico's discovery or business-event registries.
package runtime
import (
merrors "git.sendico.io/tech/sxchnge/shared/errors"
mlogger "git.sendico.io/tech/sxchnge/shared/logging"
msg "git.sendico.io/tech/sxchnge/shared/messaging"
"git.sendico.io/tech/sxchnge/shared/messaging/internal/natsb"
config "git.sendico.io/tech/sxchnge/shared/messaging/internal/natsb/config"
"git.sendico.io/tech/sxchnge/shared/messaging/internal/natscap"
"git.sendico.io/tech/sxchnge/shared/messaging/reliable"
"github.com/go-viper/mapstructure/v2"
)
type Runtime struct {
Durable reliable.Transport
DurableAdmin reliable.Admin
broker *natsb.NatsBroker
}
func New(logger mlogger.Logger, c *msg.Config) (*Runtime, error) {
if c == nil || c.Driver != msg.BBNats {
return nil, merrors.InvalidArgument("NATS messaging configuration required")
}
var settings config.Settings
decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{Result: &settings, ErrorUnused: true, TagName: "mapstructure"})
if err != nil {
return nil, merrors.InternalWrap(err, "create messaging settings decoder")
}
if err = decoder.Decode(c.Settings); err != nil {
return nil, merrors.InvalidArgument("invalid messaging settings")
}
broker, err := natsb.NewNatsBroker(mlogger.Named(logger, "messaging"), &settings)
if err != nil {
return nil, merrors.OpaqueWrap(merrors.ErrServiceUnavailable, err, "connect messaging broker")
}
adapter := natscap.NewDurableAdapter(broker)
if adapter == nil {
broker.Close()
return nil, merrors.FailedPrecondition("durable messaging unavailable")
}
return &Runtime{Durable: adapter, DurableAdmin: adapter, broker: broker}, nil
}
func (r *Runtime) Close() {
if r != nil {
r.broker.Close()
}
}