62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
package notification
|
|
|
|
import (
|
|
// External
|
|
werr "git.gibonuddevalla.se/go/wrappederror"
|
|
|
|
// Standard
|
|
"log/slog"
|
|
"slices"
|
|
)
|
|
|
|
type Service interface {
|
|
SetLogger(*slog.Logger)
|
|
GetPrio() int
|
|
GetType() string
|
|
Send(string, []byte) error
|
|
}
|
|
|
|
type Manager struct {
|
|
services []Service
|
|
logger *slog.Logger
|
|
}
|
|
|
|
func NewManager(logger *slog.Logger) (nm Manager) {
|
|
nm.services = []Service{}
|
|
nm.logger = logger
|
|
return
|
|
}
|
|
|
|
func (nm *Manager) AddService(service Service) {
|
|
nm.services = append(nm.services, service)
|
|
slices.SortFunc(nm.services, func(a, b Service) int {
|
|
if a.GetPrio() < b.GetPrio() {
|
|
return -1
|
|
}
|
|
if a.GetPrio() > b.GetPrio() {
|
|
return 1
|
|
}
|
|
return 0
|
|
})
|
|
}
|
|
|
|
func (nm *Manager) Send(uuid string, msg []byte) (err error) {
|
|
for _, service := range nm.services {
|
|
nm.logger.Info("notification", "service", service.GetType(), "prio", service.GetPrio())
|
|
if err = service.Send(uuid, msg); err == nil {
|
|
break
|
|
} else {
|
|
data := struct {
|
|
UUID string
|
|
Msg []byte
|
|
}{
|
|
uuid,
|
|
msg,
|
|
}
|
|
werr.Wrap(err).WithData(data).Log()
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|