65 lines
1.8 KiB
TypeScript
65 lines
1.8 KiB
TypeScript
import { type NextRequest } from "next/server";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { ok, errorResponse, requireRole, ApiError } from "@/lib/api";
|
|
import { deleteFileFromDisk } from "@/lib/files";
|
|
import { audit } from "@/lib/audit";
|
|
import { clientIp } from "@/lib/request";
|
|
|
|
export async function GET(_req: NextRequest, ctx: { params: Promise<{ id: string }> }) {
|
|
try {
|
|
await requireRole("admin");
|
|
const { id } = await ctx.params;
|
|
const file = await prisma.fileAsset.findUnique({ where: { id } });
|
|
if (!file) throw new ApiError(404, "not_found", "File not found");
|
|
return ok({ file });
|
|
} catch (err) {
|
|
return errorResponse(err);
|
|
}
|
|
}
|
|
|
|
export async function DELETE(req: NextRequest, ctx: { params: Promise<{ id: string }> }) {
|
|
try {
|
|
const user = await requireRole("admin");
|
|
const { id } = await ctx.params;
|
|
|
|
const file = await prisma.fileAsset.findUnique({
|
|
where: { id },
|
|
include: {
|
|
_count: {
|
|
select: { partStep: true, partDrawing: true, partCut: true, poPdfs: true },
|
|
},
|
|
},
|
|
});
|
|
if (!file) throw new ApiError(404, "not_found", "File not found");
|
|
|
|
const refs =
|
|
file._count.partStep +
|
|
file._count.partDrawing +
|
|
file._count.partCut +
|
|
file._count.poPdfs;
|
|
if (refs > 0) {
|
|
throw new ApiError(
|
|
409,
|
|
"file_in_use",
|
|
`File is referenced by ${refs} record(s). Detach it first.`,
|
|
);
|
|
}
|
|
|
|
await prisma.fileAsset.delete({ where: { id } });
|
|
await deleteFileFromDisk(file.path);
|
|
|
|
await audit({
|
|
actorId: user.id,
|
|
action: "delete",
|
|
entity: "FileAsset",
|
|
entityId: id,
|
|
before: { sha256: file.sha256, originalName: file.originalName },
|
|
ipAddress: clientIp(req),
|
|
});
|
|
|
|
return ok({ ok: true });
|
|
} catch (err) {
|
|
return errorResponse(err);
|
|
}
|
|
}
|