package library import ( "context" "sync" "github.com/jackc/pgx/v5/pgtype" "git.fabledsword.com/bvandeusen/minstrel/internal/notifications" ) // Package-level notifier for library-health notices to admins (M489): a // scan that failed, tracks gone missing, new duplicates. Set once at startup // beside SetEventBus, for the same reason the bus is package-level. Nil, as in // tests that never set it, means nobody is told. var ( notifierMu sync.RWMutex notifier *notifications.Notifier ) // SetNotifier wires the notifications inbox into the library package. func SetNotifier(n *notifications.Notifier) { notifierMu.Lock() defer notifierMu.Unlock() notifier = n } // notifyAdmins tells every admin about a library-health event. These kinds // coalesce, so a burst is one unread notice with a running count. func notifyAdmins(ctx context.Context, kind notifications.Kind, p notifications.Payload) { notifierMu.RLock() n := notifier notifierMu.RUnlock() n.NotifyLogged(ctx, kind, notifications.ToAdmins(pgtype.UUID{}), p.Map()) } // notifyScanFinished tells admins a scan run ended in error. A scan cut short // by shutdown is not a failure anyone needs telling about. func notifyScanFinished(ctx context.Context, errMsg string) { if errMsg == "" || ctx.Err() != nil { return } notifyAdmins(ctx, notifications.KindScanFailed, notifications.Payload{Count: 1, Detail: errMsg}) }