Add notification channels and a provider abstraction
Users get a notification_channels table (replacing users.ntfy_topic); pages fan
out to every enabled channel through a notify.Provider registry, with ntfy as
the first provider. Fallbacks are typed {type, address}. Schema edited in place:
existing databases must be recreated.
Claude-Session: https://claude.ai/code/session_016mBLURvJoMuUEr9cB2RpUN
This commit is contained in:
@@ -265,14 +265,18 @@ function eventText(ev, named = false) {
|
||||
case 'note': return [strong(person), ' added a note'];
|
||||
case 'resolution_note': return [strong(person), ' noted what fixed it'];
|
||||
case 'notified': {
|
||||
const to = person ? strong(person) : 'the fallback topic';
|
||||
if (ev.detail === 'reminder') return ['Reminder sent to ', to];
|
||||
if (ev.detail === 'resolved') return ['Resolution sent to ', to];
|
||||
const to = person ? strong(person) : 'the fallback';
|
||||
// The detail is "<kind> via <channel type>"; a person with two channels
|
||||
// has two of these per page, so the channel is what tells them apart.
|
||||
const [kind, via] = (ev.detail || '').split(' via ');
|
||||
const on = via ? ` on ${via}` : '';
|
||||
if (kind === 'reminder') return ['Reminder sent to ', to, on];
|
||||
if (kind === 'resolved') return ['Resolution sent to ', to, on];
|
||||
// 'escalated' is a second, later page — the next level firing, not the
|
||||
// same page landing twice — so it reads as a bug unless told apart
|
||||
// from the initial 'triggered' page below.
|
||||
if (ev.detail === 'escalated') return ['Escalation paged ', to];
|
||||
return ['Paged ', to];
|
||||
if (kind === 'escalated') return ['Escalation paged ', to, on];
|
||||
return ['Paged ', to, on];
|
||||
}
|
||||
case 'notify_failed': return ['Notification failed', ev.detail ? `: ${ev.detail}` : ''];
|
||||
case 'deadman_silent': return ['Heartbeat went silent', ev.detail ? ` (${ev.detail})` : ''];
|
||||
|
||||
Reference in New Issue
Block a user