smon/notification_manager.go
2024-06-28 17:18:08 +02:00

145 lines
2.7 KiB
Go

package main
import (
// External
werr "git.gibonuddevalla.se/go/wrappederror"
"github.com/lib/pq"
// Internal
"smon/notification"
// Standard
"encoding/json"
)
type DbNotificationService struct {
ID int
Service string
Configuration string
Prio int
}
func InitNotificationManager() (nm notification.Manager, err error) { // {{{
var dbServices []DbNotificationService
row := service.Db.Conn.QueryRow(`
WITH services AS (
SELECT
id,
prio,
service,
configuration::varchar
FROM notification n
ORDER BY
prio ASC
)
SELECT COALESCE(jsonb_agg(s.*), '[]')
FROM services s
`,
)
var dbData []byte
err = row.Scan(&dbData)
if err != nil {
err = werr.Wrap(err).WithCode("002-0006")
return
}
err = json.Unmarshal(dbData, &dbServices)
if err != nil {
err = werr.Wrap(err).WithCode("002-0007")
return
}
nm = notification.NewManager(logger)
var service notification.Service
for _, dbService := range dbServices {
service, err = notification.ServiceFactory(
dbService.Service,
[]byte(dbService.Configuration),
dbService.Prio,
"blah",
//config.Application.NotificationBaseURL,
logger,
)
if err != nil {
err = werr.Wrap(err).WithData(dbService.Service)
}
nm.AddService(service)
}
return
} // }}}
func UpdateNotificationService(svc notification.Service) (created bool, err error) { // {{{
if svc.Exists() {
_, err = service.Db.Conn.Exec(
`
UPDATE public.notification
SET
prio=$2,
configuration=$3
WHERE
prio=$1
`,
svc.GetPrio(),
svc.Updated().GetPrio(),
svc.Updated().JSON(),
)
} else {
_, err = service.Db.Conn.Exec(
`
INSERT INTO public.notification(prio, configuration, service)
VALUES($1, $2, $3)
`,
svc.Updated().GetPrio(),
svc.Updated().JSON(),
svc.GetType(),
)
created = true
}
if err != nil {
// Check if this is just a duplicated prio, which isn't allowed.
pgErr, isPgErr := err.(*pq.Error)
if isPgErr && pgErr.Code == "23505" {
return false, werr.New("Prio %d is already used by another service", svc.GetPrio())
}
return false, werr.Wrap(err).WithData(
struct {
Prio int
Configuration []byte
}{
svc.GetPrio(),
svc.JSON(),
},
)
}
return
} // }}}
func DeleteNotificationService(prio int) (err error) { // {{{
_, err = service.Db.Conn.Exec(
`
DELETE FROM public.notification
WHERE
prio = $1
`,
prio,
)
if err != nil {
return werr.Wrap(err).WithData(struct{ Prio int }{prio})
}
return
} // }}}
func AcknowledgeNotification(uuid string) (err error) { // {{{
/*
_, err = service.Db.Conn.Exec(`UPDATE schedule SET acknowledged=true WHERE schedule_uuid=$1`, uuid)
if err != nil {
err = werr.Wrap(err).WithData(uuid)
}
*/
return
} // }}}