diff --git a/src/features/notifications/providers/ntfy.ts b/src/features/notifications/providers/ntfy.ts index d51451b5..fbbc6111 100644 --- a/src/features/notifications/providers/ntfy.ts +++ b/src/features/notifications/providers/ntfy.ts @@ -1,5 +1,36 @@ import type {EventPayload, DispatchResult} from '../types'; +const getPriority = (level?: string): number => { + switch (level) { + case 'critical': return 5; + case 'error': return 4; + case 'warning': return 3; + case 'info': + default: return 2; + } +}; + +const formatData = (data: any): string => { + if (!data || typeof data !== 'object') return ''; + return '\n\nDetails:\n' + Object.entries(data) + .map(([key, value]) => { + const stringVal = value !== null && typeof value === 'object' ? JSON.stringify(value) : String(value); + return `- ${key}: ${stringVal}`; + }) + .join('\n'); +}; + +const getTags = (level?: string): string[] => { + const baseTags = ['floppy_disk']; + + if (level === 'critical') baseTags.push('rotating_light'); + else if (level === 'error') baseTags.push('x'); + else if (level === 'warning') baseTags.push('warning'); + else baseTags.push('information_source'); + + return baseTags; +}; + export async function sendNtfy( config: { ntfyServerUrl?: string; ntfyTopic: string; ntfyToken?: string, ntfyUsername?: string, ntfyPassword?: string }, payload: EventPayload @@ -11,9 +42,9 @@ export async function sendNtfy( const body = { topic: ntfyTopic, title: payload.title, - message: payload.message + (payload.data ? `\n\nData:\n${JSON.stringify(payload.data, null, 2)}` : ''), - priority: 1, - tags: [payload.level === 'critical' ? 'rotating_light' : payload.level === 'warning' ? 'warning' : 'information_source'], + message: payload.message + formatData(payload.data), + priority: getPriority(payload.level), + tags: getTags(payload.level), }; const headers: Record = {