2026-05-23 11:09:03 +08:00

77 lines
2.0 KiB
TypeScript

import { NextResponse } from "next/server";
import {
getDueDingTalkNotificationTasks,
runDingTalkNotificationJob,
} from "@/lib/jobs/dingtalk-notification-job";
function verifyAuthToken(request: Request): boolean {
const authHeader = request.headers.get("authorization");
const token = authHeader?.replace("Bearer ", "");
const cronSecret = process.env.CRON_SECRET;
if (!cronSecret) {
console.error("[DingTalkNotificationJob] CRON_SECRET 未配置,拒绝执行定时任务接口");
return false;
}
return token === cronSecret;
}
export async function GET(request: Request) {
try {
if (!verifyAuthToken(request)) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const tasks = await getDueDingTalkNotificationTasks(20);
return NextResponse.json({
dueCount: tasks.length,
tasks: tasks.map((task) => ({
id: task.id,
title: task.title,
status: task.status,
scheduledAt: task.scheduledAt,
createdAt: task.createdAt,
})),
timestamp: new Date().toISOString(),
});
} catch (error) {
return NextResponse.json(
{
success: false,
error:
error instanceof Error ? error.message : "查询钉钉通知任务失败",
timestamp: new Date().toISOString(),
},
{ status: 500 },
);
}
}
export async function POST(request: Request) {
try {
if (!verifyAuthToken(request)) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const result = await runDingTalkNotificationJob();
return NextResponse.json({
success: true,
result,
timestamp: new Date().toISOString(),
});
} catch (error) {
return NextResponse.json(
{
success: false,
error:
error instanceof Error ? error.message : "执行钉钉通知任务失败",
timestamp: new Date().toISOString(),
},
{ status: 500 },
);
}
}