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" import { recordMemberHistory } from "@/lib/member-history" 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(), generationName: z.string().optional(), courtesyName: z.string().optional(), artName: z.string().optional(), posthumousName: z.string().optional(), rank: z.number().optional(), birthDate: z.string().optional(), deathDate: z.string().optional(), isLunarDate: z.boolean().optional(), ancestralHome: z.string().optional(), birthPlace: z.string().optional(), burialPlace: z.string().optional(), phone: z.string().optional(), telephone: z.string().optional(), email: z.string().optional(), address: z.string().optional(), fatherId: z.string().optional(), motherId: z.string().optional(), spouseIds: z.array(z.string()).optional(), childrenIds: z.array(z.string()).optional(), spouseFatherName: z.string().optional(), spouseMotherName: z.string().optional(), bio: z.string().optional(), tags: z.array(z.string()).optional(), avatarUrl: z.string().optional(), photoIds: 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, } }) // 维护配偶双向关系 if (data.spouseIds && data.spouseIds.length > 0) { for (const spouseId of data.spouseIds) { const spouse = await prisma.familyMember.findUnique({ where: { id: spouseId } }) if (spouse && !spouse.spouseIds.includes(member.id)) { await prisma.familyMember.update({ where: { id: spouseId }, data: { spouseIds: [...spouse.spouseIds, member.id] } }) } } } // 维护父母-子女双向关系 // 1. 如果设置了父亲,将当前成员添加到父亲的子女列表 if (data.fatherId) { const father = await prisma.familyMember.findUnique({ where: { id: data.fatherId } }) if (father && !father.childrenIds.includes(member.id)) { await prisma.familyMember.update({ where: { id: data.fatherId }, data: { childrenIds: [...father.childrenIds, member.id] } }) } } // 2. 如果设置了母亲,将当前成员添加到母亲的子女列表 if (data.motherId) { const mother = await prisma.familyMember.findUnique({ where: { id: data.motherId } }) if (mother && !mother.childrenIds.includes(member.id)) { await prisma.familyMember.update({ where: { id: data.motherId }, data: { childrenIds: [...mother.childrenIds, member.id] } }) } } // 3. 如果设置了子女,将当前成员设置为子女的父亲或母亲 if (data.childrenIds && data.childrenIds.length > 0) { for (const childId of data.childrenIds) { const child = await prisma.familyMember.findUnique({ where: { id: childId } }) if (child) { // 根据当前成员的性别设置为父亲或母亲 if (data.gender === 'MALE' && !child.fatherId) { await prisma.familyMember.update({ where: { id: childId }, data: { fatherId: member.id } }) } else if (data.gender === 'FEMALE' && !child.motherId) { await prisma.familyMember.update({ where: { id: childId }, data: { motherId: member.id } }) } } } } // 记录成员历史版本 await recordMemberHistory({ memberId: member.id, treeId, changedBy: session.user.id, changeType: 'CREATE', newData: member }) // 记录操作日志 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 } ) } }