Files
vps-tracker/apps/api/src/services/notifications/channels.ts
T
DenozordecandCursor 9e0311b53a
Docker / build (push) Failing after 26s
feat(settings): добавить Bot API URL и ячейку ошибок уведомлений
Монитор больше не ставит «Внимание» по скрытому счётчику. Telegram можно слать через локальный telegram-bot-api.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-22 02:29:07 +07:00

47 lines
1.7 KiB
TypeScript

import { sendTelegramMessage } from '../telegram.js'
import type { WebhookPayload } from '../webhook.js'
import type { NotificationChannel, SettingsNotifyRow } from './types.js'
export async function deliverTelegram(
settings: SettingsNotifyRow,
messageHtml: string,
): Promise<{ ok: boolean; error?: string }> {
const token = settings.telegramBotToken?.trim()
const chatId = settings.telegramChatId?.trim()
if (!token || !chatId) return { ok: false, error: 'Telegram не настроен' }
return sendTelegramMessage(
token,
chatId,
messageHtml,
settings.telegramMessageThreadId,
settings.telegramApiUrl,
)
}
export async function deliverWebhook(
settings: SettingsNotifyRow,
payload: WebhookPayload,
): Promise<{ ok: boolean; error?: string }> {
if (!settings.webhookEnabled) return { ok: false, error: 'Webhook выключен' }
const url = settings.webhookUrl?.trim()
if (!url) return { ok: false, error: 'Webhook URL не указан' }
try {
const res = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
})
if (!res.ok) return { ok: false, error: `HTTP ${res.status}` }
return { ok: true }
} catch (err) {
return { ok: false, error: err instanceof Error ? err.message : String(err) }
}
}
export function activeChannels(settings: SettingsNotifyRow): NotificationChannel[] {
const channels: NotificationChannel[] = []
if (settings.telegramBotToken?.trim() && settings.telegramChatId?.trim()) channels.push('telegram')
if (settings.webhookEnabled && settings.webhookUrl?.trim()) channels.push('webhook')
return channels
}