Your Name 2561c66cb8
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: update workflow categories and admin notifications
2026-05-07 19:31:14 +08:00

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 },
);
}
}