69 lines
2.1 KiB
TypeScript
69 lines
2.1 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { prisma } from "@/lib/db";
|
|
import { getActiveAccountId } from "@/lib/account-context";
|
|
import { apiRouteErrorResponse } from "@/lib/auth/api";
|
|
import { requireUserAccountScope } from "@/lib/auth/user-scope";
|
|
import { deleteDraftImages, parseDraftImagePaths } from "@/lib/drafts/images";
|
|
|
|
export async function GET(request: Request) {
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const statusParam = searchParams.get("status");
|
|
|
|
const statuses = statusParam
|
|
? statusParam.split(",").map((s) => s.trim())
|
|
: undefined;
|
|
const accountId = await getActiveAccountId();
|
|
const { where: accountWhere } = await requireUserAccountScope(accountId);
|
|
|
|
const drafts = await prisma.draft.findMany({
|
|
where: {
|
|
...accountWhere,
|
|
...(statuses
|
|
? { status: { in: statuses } }
|
|
: { status: { notIn: ["PUBLISHED", "REJECTED"] } }),
|
|
},
|
|
orderBy: { createdAt: "desc" },
|
|
});
|
|
|
|
return NextResponse.json({ drafts });
|
|
} catch (error) {
|
|
return apiRouteErrorResponse(error, "drafts");
|
|
}
|
|
}
|
|
|
|
export async function DELETE(request: Request) {
|
|
try {
|
|
const body = (await request.json()) as { ids?: unknown };
|
|
const ids = Array.isArray(body.ids)
|
|
? body.ids.filter((id): id is string => typeof id === "string" && id.length > 0)
|
|
: [];
|
|
|
|
if (ids.length === 0) {
|
|
return NextResponse.json({ error: "請提供要刪除的草稿 ID" }, { status: 400 });
|
|
}
|
|
|
|
const accountId = await getActiveAccountId();
|
|
const { where: accountWhere } = await requireUserAccountScope(accountId);
|
|
|
|
const drafts = await prisma.draft.findMany({
|
|
where: {
|
|
id: { in: ids },
|
|
...accountWhere,
|
|
status: { not: "REJECTED" },
|
|
},
|
|
});
|
|
|
|
for (const draft of drafts) {
|
|
await deleteDraftImages(parseDraftImagePaths(draft));
|
|
await prisma.draft.update({
|
|
where: { id: draft.id },
|
|
data: { status: "REJECTED", imagePath: null, imagePaths: null },
|
|
});
|
|
}
|
|
|
|
return NextResponse.json({ deleted: drafts.length });
|
|
} catch (error) {
|
|
return apiRouteErrorResponse(error, "drafts");
|
|
}
|
|
} |