smon/notification_manager.go
2026-08-19 17:53:52 +02:00

150 lines
2.8 KiB
Go

package main
import (
// External
werr "git.ahall.se/go/wrappederror"
"github.com/jackc/pgx/v5/pgconn"
// Internal
"smon/notification"
// Standard
"context"
"encoding/json"
"errors"
)
type DbNotificationService struct {
ID int
Service string
Configuration string
Prio int
}
func initNotificationManager() (nm notification.Manager, err error) { // {{{
var dbServices []DbNotificationService
row := db.QueryRow(
context.Background(),
`
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 = db.Exec(
context.Background(),
`
UPDATE public.notification
SET
prio=$2,
configuration=$3
WHERE
prio=$1
`,
svc.GetPrio(),
svc.Updated().GetPrio(),
svc.Updated().JSON(),
)
} else {
_, err = db.Exec(
context.Background(),
`
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.
var pgErr *pgconn.PgError
if errors.As(err, &pgErr); pgErr.Code == "23505" {
return false, werr.New("Prio %d is already used by another service", svc.Updated().GetPrio())
}
return false, werr.Wrap(err).WithData(
struct {
Prio int
Configuration []byte
}{
svc.GetPrio(),
svc.JSON(),
},
)
}
return
} // }}}
func DeleteNotificationService(prio int) (err error) { // {{{
_, err = db.Exec(
context.Background(),
`
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 = db.Exec(context.Background(), `UPDATE schedule SET acknowledged=true WHERE schedule_uuid=$1`, uuid)
if err != nil {
err = werr.Wrap(err).WithData(uuid)
}
*/
return
} // }}}