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
|
||
|
}
|