Files
Checkmate/client/src/Validation/notifications.ts
T
Léo eacbb227c3 feat(notifications): add Telegram notification channel (#2753)
Add Telegram as a new notification type, allowing users to receive
monitor alerts via a Telegram bot.

Configuration requires:
- Bot token (obtained from @BotFather)
- Chat ID (user, group, or channel)

Changes:
- TelegramProvider: sends HTML-formatted messages via Telegram Bot API
- NotificationsService: route telegram type to TelegramProvider
- Notification model/types: add 'telegram' to NotificationChannel enum
- Server validation: telegram schema (accessToken + address/chat_id)
- Client Types/Validation: telegram schema with accessToken + address
- useNotificationForm: handle telegram defaults
- Notifications create page: render Telegram config UI
- en.json: add telegram i18n keys
2026-03-24 10:15:46 -04:00

71 lines
1.9 KiB
TypeScript

import { z } from "zod";
const baseSchema = z.object({
notificationName: z
.string()
.min(1, "Notification name is required")
.max(100, "Notification name must be at most 100 characters"),
});
const emailSchema = baseSchema.extend({
type: z.literal("email"),
address: z
.string()
.min(1, "Email is required")
.email("Please enter a valid email address"),
});
const slackSchema = baseSchema.extend({
type: z.literal("slack"),
address: z.string().min(1, "Webhook URL is required").url("Please enter a valid URL"),
});
const discordSchema = baseSchema.extend({
type: z.literal("discord"),
address: z.string().min(1, "Webhook URL is required").url("Please enter a valid URL"),
});
const webhookSchema = baseSchema.extend({
type: z.literal("webhook"),
address: z.string().min(1, "Webhook URL is required").url("Please enter a valid URL"),
});
const pagerDutySchema = baseSchema.extend({
type: z.literal("pager_duty"),
address: z.string().min(1, "Integration key is required"),
});
const matrixSchema = baseSchema.extend({
type: z.literal("matrix"),
homeserverUrl: z
.string()
.min(1, "Homeserver URL is required")
.url("Please enter a valid URL"),
roomId: z.string().min(1, "Room ID is required"),
accessToken: z.string().min(1, "Access token is required"),
});
const teamsSchema = baseSchema.extend({
type: z.literal("teams"),
address: z.string().min(1, "Webhook URL is required").url("Please enter a valid URL"),
});
const telegramSchema = baseSchema.extend({
type: z.literal("telegram"),
address: z.string().min(1, "Chat ID is required"),
accessToken: z.string().min(1, "Bot token is required"),
});
export const notificationSchema = z.discriminatedUnion("type", [
emailSchema,
slackSchema,
discordSchema,
webhookSchema,
pagerDutySchema,
matrixSchema,
teamsSchema,
telegramSchema,
]);
export type NotificationFormData = z.infer<typeof notificationSchema>;