import { NextRequest, NextResponse } from "next/server" import { getServerSession } from "next-auth" import { authOptions } from "@/lib/auth" import { prisma } from "@/lib/prisma" // 获取单个家族树信息 export async function GET( req: NextRequest, { params }: { params: Promise<{ treeId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId } = await params // 并行查询树信息和协作者角色 const [tree, collaborator] = await Promise.all([ prisma.familyTree.findFirst({ where: { id: treeId, OR: [ { ownerId: session.user.id }, { collaborators: { some: { userId: session.user.id } } } ] }, select: { id: true, name: true, description: true, rootMemberId: true, ownerId: true, createdAt: true, updatedAt: true, owner: { select: { id: true, name: true, email: true, } }, _count: { select: { members: true, collaborators: true, } } } }), prisma.treeCollaborator.findFirst({ where: { treeId, userId: session.user.id }, select: { role: true } }) ]) if (!tree) { return NextResponse.json({ error: "家族树不存在或无权访问" }, { status: 404 }) } // 计算当前用户角色 const currentUserRole = tree.ownerId === session.user.id ? "OWNER" : (collaborator?.role || "VIEWER") // 添加缓存头 const response = NextResponse.json({ tree: { ...tree, currentUserRole } }) response.headers.set('Cache-Control', 'private, max-age=60, stale-while-revalidate=30') return response } catch (error) { console.error("获取家族树失败:", error) return NextResponse.json( { error: "获取家族树失败" }, { status: 500 } ) } } // 更新家族树信息 export async function PATCH( req: NextRequest, { params }: { params: Promise<{ treeId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId } = await params const body = await req.json() const { name, description } = body // 检查权限 const tree = await prisma.familyTree.findFirst({ where: { id: treeId, ownerId: session.user.id } }) if (!tree) { return NextResponse.json({ error: "家族树不存在或无权修改" }, { status: 404 }) } // 更新家族树 const updatedTree = await prisma.familyTree.update({ where: { id: treeId }, data: { name: name || tree.name, description: description !== undefined ? description : tree.description, }, include: { owner: { select: { id: true, name: true, email: true, } } } }) return NextResponse.json({ tree: updatedTree }) } catch (error) { console.error("更新家族树失败:", error) return NextResponse.json( { error: "更新家族树失败" }, { status: 500 } ) } } // 删除家族树 export async function DELETE( req: NextRequest, { params }: { params: Promise<{ treeId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId } = await params // 检查权限 const tree = await prisma.familyTree.findFirst({ where: { id: treeId, ownerId: session.user.id } }) if (!tree) { return NextResponse.json({ error: "家族树不存在或无权删除" }, { status: 404 }) } // 删除家族树(会级联删除所有成员和相关数据) await prisma.familyTree.delete({ where: { id: treeId } }) return NextResponse.json({ success: true }) } catch (error) { console.error("删除家族树失败:", error) return NextResponse.json( { error: "删除家族树失败" }, { status: 500 } ) } }