import { z } from "zod"; import { getSystemSetting } from "@/lib/db/queries"; import { ChatSDKError } from "@/lib/errors"; import { requireAdmin } from "@/lib/middleware/admin"; import { DINGTALK_ROBOT_NOTIFICATION_CONFIG_KEY, defaultDingTalkRobotNotificationConfig, normalizeDingTalkRobotNotificationConfig, } from "@/lib/notifications/dingtalk-robot-config"; import { sendDingTalkRobotNotification } from "@/lib/notifications/dingtalk-robot"; const bodySchema = z.object({ title: z.string().trim().min(1, "通知标题不能为空").max(100, "通知标题过长"), content: z .string() .trim() .min(1, "通知内容不能为空") .max(20000, "通知内容过长"), }); export async function POST(request: Request) { try { await requireAdmin(); const body = bodySchema.parse(await request.json()); const setting = await getSystemSetting({ key: DINGTALK_ROBOT_NOTIFICATION_CONFIG_KEY, }).catch(() => null); const config = setting?.value ? normalizeDingTalkRobotNotificationConfig(setting.value) : defaultDingTalkRobotNotificationConfig; const result = await sendDingTalkRobotNotification({ config, title: body.title, content: body.content, }); return Response.json({ success: true, result, }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } if (error instanceof z.ZodError) { return Response.json( { success: false, error: error.issues[0]?.message || "参数校验失败", }, { status: 400 }, ); } return Response.json( { success: false, error: error instanceof Error ? error.message : "发送钉钉通知失败", }, { status: 500 }, ); } }