68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
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 },
|
|
);
|
|
}
|
|
}
|