Files
mnote/wolai-frontend/src/app/api/mindmap-trash/empty/route.ts
T
2026-01-18 05:13:53 +08:00

102 lines
3.1 KiB
TypeScript

import { NextResponse } from "next/server";
import { createSupabaseRouteClient } from "@/lib/supabase/server";
import { promises as fs } from "fs";
import path from "path";
import { getDocumentsBaseDir, getLegacyMindmapsBaseDir } from "@/lib/server/local-paths";
import { isConvexEnabled } from "@/lib/convex/enabled";
import { getAuthedConvexClient } from "@/lib/convex/route";
import { api } from "@/lib/convex/api";
export const dynamic = "force-dynamic";
const preferredBaseDir = getDocumentsBaseDir();
const legacyBaseDir = getLegacyMindmapsBaseDir();
interface EmptyTrashPayload {
workspaceId?: string;
}
async function purgeTrashFolder(folder: string): Promise<number> {
const trashDir = path.join(folder, ".trash");
try {
const entries = await fs.readdir(trashDir);
let removed = 0;
for (const name of entries) {
await fs.rm(path.join(trashDir, name), { force: true, recursive: true });
removed += 1;
}
return removed;
} catch {
return 0;
}
}
export async function POST(request: Request) {
if (isConvexEnabled()) {
const { auth, client } = await getAuthedConvexClient();
const { workspaceId }: EmptyTrashPayload = await request.json().catch(() => ({}));
if (!workspaceId) {
return NextResponse.json({ error: "缺少 workspaceId" }, { status: 400 });
}
try {
const result = await client.mutation(api.mindmaps.emptyTrashByWorkspace, {
userId: auth.userId,
workspaceId,
});
return NextResponse.json({ ok: true, removed: result?.deletedCount ?? 0 });
} catch (error) {
return NextResponse.json({ error: (error as Error).message }, { status: 400 });
}
}
const supabase = await createSupabaseRouteClient();
const {
data: { session },
} = await supabase.auth.getSession();
if (!session) {
return NextResponse.json({ error: "未登录" }, { status: 401 });
}
const { workspaceId }: EmptyTrashPayload = await request.json().catch(() => ({}));
if (!workspaceId) {
return NextResponse.json({ error: "缺少 workspaceId" }, { status: 400 });
}
const { data: membership, error: membershipError } = await supabase
.from("workspace_members")
.select("workspace_id")
.eq("workspace_id", workspaceId)
.eq("user_id", session.user.id)
.limit(1);
if (membershipError) {
return NextResponse.json({ error: membershipError.message }, { status: 500 });
}
if (!membership || membership.length === 0) {
return NextResponse.json({ error: "无权操作该工作空间" }, { status: 403 });
}
const { data: documents, error: docError } = await supabase
.from("documents")
.select("id")
.eq("workspace_id", workspaceId)
.eq("user_id", session.user.id)
.limit(5000);
if (docError) {
return NextResponse.json({ error: docError.message }, { status: 500 });
}
const docIds = (documents ?? []).map((row) => row.id).filter(Boolean);
let removed = 0;
for (const docId of docIds) {
removed += await purgeTrashFolder(path.join(preferredBaseDir, docId));
removed += await purgeTrashFolder(path.join(legacyBaseDir, docId));
}
return NextResponse.json({ ok: true, removed });
}