53 lines
2.2 KiB
TypeScript
53 lines
2.2 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { getActiveAccountId } from "@/lib/account-context";
|
|
import { authErrorResponse } from "@/lib/auth/api";
|
|
import { requireUserAccountScope } from "@/lib/auth/user-scope";
|
|
import { prisma } from "@/lib/db";
|
|
|
|
export async function DELETE(request: Request) {
|
|
try {
|
|
const body = (await request.json()) as { ids?: string[] };
|
|
const ids = [...new Set((body.ids ?? []).filter(Boolean))].slice(0, 100);
|
|
if (ids.length === 0) {
|
|
return NextResponse.json({ error: "請至少選擇一則留言草稿" }, { status: 400 });
|
|
}
|
|
|
|
const { where } = await requireUserAccountScope(await getActiveAccountId());
|
|
const drafts = await prisma.outreachDraft.findMany({
|
|
where: {
|
|
id: { in: ids },
|
|
outreachTarget: { scanItem: { scan: { ...where, scanGoal: "placement" } } },
|
|
},
|
|
select: { id: true, status: true, outreachTargetId: true },
|
|
});
|
|
if (drafts.length !== ids.length) {
|
|
return NextResponse.json({ error: "部分草稿不存在或不屬於目前帳號" }, { status: 403 });
|
|
}
|
|
if (drafts.some((draft) => draft.status === "PUBLISHED")) {
|
|
return NextResponse.json({ error: "已發布留言不能只刪除本地紀錄" }, { status: 409 });
|
|
}
|
|
|
|
const targetIds = [...new Set(drafts.map((draft) => draft.outreachTargetId))];
|
|
const result = await prisma.$transaction(async (tx) => {
|
|
const deleted = await tx.outreachDraft.deleteMany({ where: { id: { in: ids } } });
|
|
const emptyTargets = await tx.outreachTarget.findMany({
|
|
where: { id: { in: targetIds }, drafts: { none: {} } },
|
|
select: { id: true },
|
|
});
|
|
if (emptyTargets.length > 0) {
|
|
await tx.outreachTarget.deleteMany({
|
|
where: { id: { in: emptyTargets.map((target) => target.id) } },
|
|
});
|
|
}
|
|
return { deleted: deleted.count, removedTargets: emptyTargets.length };
|
|
});
|
|
|
|
return NextResponse.json(result);
|
|
} catch (error) {
|
|
const authRes = authErrorResponse(error);
|
|
if (authRes) return authRes;
|
|
const message = error instanceof Error ? error.message : "批次刪除失敗";
|
|
return NextResponse.json({ error: message }, { status: 500 });
|
|
}
|
|
}
|