75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import { NextResponse } from "next/server";
|
|||
|
|
import { createSupabaseRouteClient } from "@/lib/supabase/server";
|
||
|
|
|
||
|
|
interface DuplicatePayload {
|
||
|
|
documentId: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function POST(request: Request) {
|
||
|
|
const supabase = await createSupabaseRouteClient();
|
||
|
|
const {
|
||
|
|
data: { session },
|
||
|
|
} = await supabase.auth.getSession();
|
||
|
|
|
||
|
|
if (!session) {
|
||
|
|
return NextResponse.json({ error: "未登录" }, { status: 401 });
|
||
|
|
}
|
||
|
|
|
||
|
|
const { documentId }: DuplicatePayload = await request.json();
|
||
|
|
|
||
|
|
if (!documentId) {
|
||
|
|
return NextResponse.json({ error: "缺少 documentId" }, { status: 400 });
|
||
|
|
}
|
||
|
|
|
||
|
|
const { data: sourceDoc, error: sourceError } = await supabase
|
||
|
|
.from("documents")
|
||
|
|
.select("id,title,content,parent_id,workspace_id,access_scope")
|
||
|
|
.eq("id", documentId)
|
||
|
|
.eq("user_id", session.user.id)
|
||
|
|
.single();
|
||
|
|
|
||
|
|
if (sourceError || !sourceDoc) {
|
||
|
|
return NextResponse.json({ error: "页面不存在或无权访问" }, { status: 404 });
|
||
|
|
}
|
||
|
|
|
||
|
|
const siblingQuery = supabase
|
||
|
|
.from("documents")
|
||
|
|
.select("id", { head: true, count: "exact" })
|
||
|
|
.eq("workspace_id", sourceDoc.workspace_id);
|
||
|
|
|
||
|
|
if (sourceDoc.parent_id) {
|
||
|
|
siblingQuery.eq("parent_id", sourceDoc.parent_id);
|
||
|
|
} else {
|
||
|
|
siblingQuery.is("parent_id", null);
|
||
|
|
}
|
||
|
|
|
||
|
|
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 duplicatedTitle = `${fallbackTitle} 副本`;
|
||
|
|
|
||
|
|
const { data: duplicated, error: duplicateError } = await supabase
|
||
|
|
.from("documents")
|
||
|
|
.insert({
|
||
|
|
user_id: session.user.id,
|
||
|
|
workspace_id: sourceDoc.workspace_id,
|
||
|
|
parent_id: sourceDoc.parent_id,
|
||
|
|
access_scope: sourceDoc.access_scope ?? "private",
|
||
|
|
title: duplicatedTitle,
|
||
|
|
content: sourceDoc.content,
|
||
|
|
sort_order: siblingCount,
|
||
|
|
})
|
||
|
|
.select("id,title,parent_id,sort_order")
|
||
|
|
.single();
|
||
|
|
|
||
|
|
if (duplicateError || !duplicated) {
|
||
|
|
return NextResponse.json({ error: duplicateError?.message ?? "复制失败" }, { status: 500 });
|
||
|
|
}
|
||
|
|
|
||
|
|
return NextResponse.json(duplicated);
|
||
|
|
}
|