双向删除同步

This commit is contained in:
liaibo
2026-01-02 07:25:50 +08:00
parent 1db64c1c55
commit b1288487af
48 changed files with 2406 additions and 8841 deletions
@@ -1,10 +1,36 @@
import { NextResponse } from "next/server";
import { createSupabaseRouteClient } from "@/lib/supabase/server";
import path from "path";
import { promises as fs } from "fs";
interface DuplicatePayload {
documentId: string;
}
const documentsBaseDir = path.join(process.cwd(), "public", "documents");
async function ensureDocumentScaffold(id: string, title: string | null) {
const folder = path.join(documentsBaseDir, id);
const indexFile = path.join(folder, "index.md");
await fs.mkdir(folder, { recursive: true });
const safeTitle = title && title.trim() ? title.trim() : "无标题";
const content = `# ${safeTitle}\n`;
await fs.writeFile(indexFile, content, "utf8");
}
async function copyMindmapIfExists(sourceId: string, targetId: string) {
const src = path.join(documentsBaseDir, sourceId, "mindmap.json");
const destDir = path.join(documentsBaseDir, targetId);
const dest = path.join(destDir, "mindmap.json");
try {
const buf = await fs.readFile(src);
await fs.mkdir(destDir, { recursive: true });
await fs.writeFile(dest, buf);
} catch {
// 如果源不存在则忽略
}
}
export async function POST(request: Request) {
const supabase = await createSupabaseRouteClient();
const {
@@ -16,7 +42,6 @@ export async function POST(request: Request) {
}
const { documentId }: DuplicatePayload = await request.json();
if (!documentId) {
return NextResponse.json({ error: "缺少 documentId" }, { status: 400 });
}
@@ -44,12 +69,14 @@ export async function POST(request: Request) {
}
const { count: siblingCount = 0, error: countError } = await siblingQuery;
if (countError) {
return NextResponse.json({ error: countError.message }, { status: 500 });
}
const fallbackTitle = sourceDoc.title?.trim() && sourceDoc.title.trim().length > 0 ? sourceDoc.title.trim() : "无标题";
const fallbackTitle =
sourceDoc.title?.trim() && sourceDoc.title.trim().length > 0
? sourceDoc.title.trim()
: "无标题";
const duplicatedTitle = `${fallbackTitle} 副本`;
const { data: duplicated, error: duplicateError } = await supabase
@@ -67,8 +94,14 @@ export async function POST(request: Request) {
.single();
if (duplicateError || !duplicated) {
return NextResponse.json({ error: duplicateError?.message ?? "复制失败" }, { status: 500 });
return NextResponse.json(
{ error: duplicateError?.message ?? "复制失败" },
{ status: 500 },
);
}
await ensureDocumentScaffold(duplicated.id, duplicated.title ?? duplicatedTitle);
await copyMindmapIfExists(sourceDoc.id, duplicated.id);
return NextResponse.json(duplicated);
}