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 { 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 }); }