63 lines
2.2 KiB
TypeScript
63 lines
2.2 KiB
TypeScript
|
|
import { NextResponse } from "next/server";
|
|||
|
|
import { getActiveAccountProfile } from "@/lib/account-context";
|
|||
|
|
import { getRulesForAccount, upsertRule } from "@/lib/automation/rules";
|
|||
|
|
import { isValidCron } from "@/lib/automation/cron-match";
|
|||
|
|
import { AUTOMATION_TASK_TYPES, type AutomationTaskType } from "@/lib/automation/types";
|
|||
|
|
import { apiRouteErrorResponse } from "@/lib/auth/api";
|
|||
|
|
|
|||
|
|
export async function GET() {
|
|||
|
|
try {
|
|||
|
|
const account = await getActiveAccountProfile();
|
|||
|
|
if (!account) {
|
|||
|
|
return NextResponse.json({ error: "尚未建立帳號,請先到帳號策略新增人設" }, { status: 400 });
|
|||
|
|
}
|
|||
|
|
const rules = await getRulesForAccount(account.id);
|
|||
|
|
return NextResponse.json({
|
|||
|
|
accountId: account.id,
|
|||
|
|
accountName: account.displayName ?? account.username ?? "未命名帳號",
|
|||
|
|
automationEnabled: account.automationEnabled,
|
|||
|
|
rules,
|
|||
|
|
});
|
|||
|
|
} catch (error) {
|
|||
|
|
return apiRouteErrorResponse(error, "automation/rules");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export async function PATCH(request: Request) {
|
|||
|
|
try {
|
|||
|
|
const account = await getActiveAccountProfile();
|
|||
|
|
if (!account) {
|
|||
|
|
return NextResponse.json({ error: "尚未建立帳號" }, { status: 400 });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const body = (await request.json().catch(() => ({}))) as {
|
|||
|
|
taskType?: string;
|
|||
|
|
mode?: "manual" | "auto";
|
|||
|
|
dailyCap?: number;
|
|||
|
|
schedule?: string;
|
|||
|
|
enabled?: boolean;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
if (!body.taskType || !AUTOMATION_TASK_TYPES.includes(body.taskType as AutomationTaskType)) {
|
|||
|
|
return NextResponse.json({ error: "無效的任務類型" }, { status: 400 });
|
|||
|
|
}
|
|||
|
|
if (body.schedule !== undefined && !isValidCron(body.schedule)) {
|
|||
|
|
return NextResponse.json({ error: "無效的 cron 排程(需 5 欄位)" }, { status: 400 });
|
|||
|
|
}
|
|||
|
|
if (body.dailyCap !== undefined && (body.dailyCap < 0 || body.dailyCap > 500)) {
|
|||
|
|
return NextResponse.json({ error: "每日上限需在 0–500 之間" }, { status: 400 });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const rule = await upsertRule(account.id, body.taskType as AutomationTaskType, {
|
|||
|
|
mode: body.mode,
|
|||
|
|
dailyCap: body.dailyCap,
|
|||
|
|
schedule: body.schedule,
|
|||
|
|
enabled: body.enabled,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return NextResponse.json({ rule });
|
|||
|
|
} catch (error) {
|
|||
|
|
return apiRouteErrorResponse(error, "automation/rules/update");
|
|||
|
|
}
|
|||
|
|
}
|