import { NextRequest, NextResponse } from "next/server" import { getServerSession } from "next-auth" import { authOptions } from "@/lib/auth" import { prisma } from "@/lib/prisma" import { checkPermission } from "@/lib/permissions" import { Role, Gender } from "@prisma/client" import { z } from "zod" const createMemberSchema = z.object({ surname: z.string().min(1), givenName: z.string().min(1), fullName: z.string().min(1), gender: z.nativeEnum(Gender), generation: z.number().int().positive(), birthDate: z.string().optional(), deathDate: z.string().optional(), fatherId: z.string().optional(), motherId: z.string().optional(), spouseIds: z.array(z.string()).optional(), // ... 其他字段 }) // 获取家族树的所有成员 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 { hasPermission } = await checkPermission(session.user.id, treeId) if (!hasPermission) { return NextResponse.json({ error: "无权访问此家族树" }, { status: 403 }) } // 获取家族树信息 const tree = await prisma.familyTree.findUnique({ where: { id: treeId }, select: { rootMemberId: true } }) const members = await prisma.familyMember.findMany({ where: { treeId }, orderBy: [ { generation: 'asc' }, { createdAt: 'asc' } ] }) // 如果没有设置 rootMemberId,尝试找到第一代成员作为根 let rootId = tree?.rootMemberId if (!rootId && members.length > 0) { const firstGenMember = members.find((m: any) => m.generation === 1) if (firstGenMember) { rootId = firstGenMember.id // 更新家族树的 rootMemberId await prisma.familyTree.update({ where: { id: treeId }, data: { rootMemberId: firstGenMember.id } }) } } console.log('👥 GET /api/trees/[treeId]/members 返回数据:', { treeId, userId: session.user.id, membersCount: members.length, rootId, members: members.map(m => ({ id: m.id, fullName: m.fullName, generation: m.generation })) }) return NextResponse.json({ members, rootId }) } catch (error) { console.error("获取成员失败:", error) return NextResponse.json( { error: "获取成员失败" }, { status: 500 } ) } } // 创建新成员 export async function POST( 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 // 检查权限(需要 EDITOR 权限) const { hasPermission } = await checkPermission(session.user.id, treeId, Role.EDITOR) if (!hasPermission) { return NextResponse.json({ error: "无权限添加成员" }, { status: 403 }) } const body = await req.json() const data = createMemberSchema.parse(body) const member = await prisma.familyMember.create({ data: { ...data, treeId, } }) // 记录操作日志 await prisma.activityLog.create({ data: { treeId, userId: session.user.id, action: 'CREATE', entityType: 'MEMBER', entityId: member.id, entityName: member.fullName, } }) return NextResponse.json({ member }, { status: 201 }) } catch (error) { if (error instanceof z.ZodError) { return NextResponse.json( { error: error.errors[0].message }, { status: 400 } ) } console.error("创建成员失败:", error) return NextResponse.json( { error: "创建成员失败" }, { status: 500 } ) } }