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 } from "@prisma/client" // 获取单个成员 export async function GET( req: NextRequest, { params }: { params: Promise<{ treeId: string; memberId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId, memberId } = await params // 检查权限 const { hasPermission } = await checkPermission(session.user.id, treeId) if (!hasPermission) { return NextResponse.json({ error: "无权访问此家族树" }, { status: 403 }) } const member = await prisma.familyMember.findFirst({ where: { id: memberId, treeId, } }) if (!member) { return NextResponse.json({ error: "成员不存在" }, { status: 404 }) } return NextResponse.json({ member }) } catch (error) { console.error("获取成员失败:", error) return NextResponse.json( { error: "获取成员失败" }, { status: 500 } ) } } // 更新成员 export async function PATCH( req: NextRequest, { params }: { params: Promise<{ treeId: string; memberId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId, memberId } = 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 existingMember = await prisma.familyMember.findFirst({ where: { id: memberId, treeId, } }) if (!existingMember) { return NextResponse.json({ error: "成员不存在" }, { status: 404 }) } const member = await prisma.familyMember.update({ where: { id: memberId }, data: { ...body, updatedAt: new Date(), } }) // 维护配偶双向关系 if (body.spouseIds !== undefined) { const newSpouseIds = body.spouseIds || [] const oldSpouseIds = existingMember.spouseIds || [] // 添加新配偶的反向关系 for (const spouseId of newSpouseIds) { if (!oldSpouseIds.includes(spouseId)) { const spouse = await prisma.familyMember.findUnique({ where: { id: spouseId } }) if (spouse && !spouse.spouseIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: spouseId }, data: { spouseIds: [...spouse.spouseIds, memberId] } }) } } } // 移除旧配偶的反向关系 for (const oldSpouseId of oldSpouseIds) { if (!newSpouseIds.includes(oldSpouseId)) { const spouse = await prisma.familyMember.findUnique({ where: { id: oldSpouseId } }) if (spouse && spouse.spouseIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: oldSpouseId }, data: { spouseIds: spouse.spouseIds.filter(id => id !== memberId) } }) } } } } // 维护父母-子女双向关系 // 1. 处理父亲关系变化 if (body.fatherId !== undefined) { const oldFatherId = existingMember.fatherId const newFatherId = body.fatherId // 从旧父亲的子女列表中移除 if (oldFatherId && oldFatherId !== newFatherId) { const oldFather = await prisma.familyMember.findUnique({ where: { id: oldFatherId } }) if (oldFather && oldFather.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: oldFatherId }, data: { childrenIds: oldFather.childrenIds.filter(id => id !== memberId) } }) } } // 添加到新父亲的子女列表 if (newFatherId && newFatherId !== oldFatherId) { const newFather = await prisma.familyMember.findUnique({ where: { id: newFatherId } }) if (newFather && !newFather.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: newFatherId }, data: { childrenIds: [...newFather.childrenIds, memberId] } }) } } } // 2. 处理母亲关系变化 if (body.motherId !== undefined) { const oldMotherId = existingMember.motherId const newMotherId = body.motherId // 从旧母亲的子女列表中移除 if (oldMotherId && oldMotherId !== newMotherId) { const oldMother = await prisma.familyMember.findUnique({ where: { id: oldMotherId } }) if (oldMother && oldMother.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: oldMotherId }, data: { childrenIds: oldMother.childrenIds.filter(id => id !== memberId) } }) } } // 添加到新母亲的子女列表 if (newMotherId && newMotherId !== oldMotherId) { const newMother = await prisma.familyMember.findUnique({ where: { id: newMotherId } }) if (newMother && !newMother.childrenIds.includes(memberId)) { await prisma.familyMember.update({ where: { id: newMotherId }, data: { childrenIds: [...newMother.childrenIds, memberId] } }) } } } // 3. 处理子女关系变化 if (body.childrenIds !== undefined) { const newChildrenIds = body.childrenIds || [] const oldChildrenIds = existingMember.childrenIds || [] // 添加新子女的父母关系 for (const childId of newChildrenIds) { if (!oldChildrenIds.includes(childId)) { const child = await prisma.familyMember.findUnique({ where: { id: childId } }) if (child) { // 根据当前成员的性别设置为父亲或母亲 if (member.gender === 'MALE' && !child.fatherId) { await prisma.familyMember.update({ where: { id: childId }, data: { fatherId: memberId } }) } else if (member.gender === 'FEMALE' && !child.motherId) { await prisma.familyMember.update({ where: { id: childId }, data: { motherId: memberId } }) } } } } // 移除旧子女的父母关系 for (const oldChildId of oldChildrenIds) { if (!newChildrenIds.includes(oldChildId)) { const child = await prisma.familyMember.findUnique({ where: { id: oldChildId } }) if (child) { // 根据当前成员的性别移除父亲或母亲 if (member.gender === 'MALE' && child.fatherId === memberId) { await prisma.familyMember.update({ where: { id: oldChildId }, data: { fatherId: null } }) } else if (member.gender === 'FEMALE' && child.motherId === memberId) { await prisma.familyMember.update({ where: { id: oldChildId }, data: { motherId: null } }) } } } } } // 记录操作日志 await prisma.activityLog.create({ data: { treeId, userId: session.user.id, action: 'UPDATE', entityType: 'MEMBER', entityId: member.id, entityName: member.fullName, changes: body, } }) return NextResponse.json({ member }) } catch (error) { console.error("更新成员失败:", error) return NextResponse.json( { error: "更新成员失败" }, { status: 500 } ) } } // 删除成员 export async function DELETE( req: NextRequest, { params }: { params: Promise<{ treeId: string; memberId: string }> } ) { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } const { treeId, memberId } = await params // 检查权限(需要 EDITOR 权限) const { hasPermission } = await checkPermission(session.user.id, treeId, Role.EDITOR) if (!hasPermission) { return NextResponse.json({ error: "无权限删除成员" }, { status: 403 }) } // 检查成员是否存在 const existingMember = await prisma.familyMember.findFirst({ where: { id: memberId, treeId, } }) if (!existingMember) { return NextResponse.json({ error: "成员不存在" }, { status: 404 }) } await prisma.familyMember.delete({ where: { id: memberId } }) // 记录操作日志 await prisma.activityLog.create({ data: { treeId, userId: session.user.id, action: 'DELETE', entityType: 'MEMBER', entityId: memberId, entityName: existingMember.fullName, } }) return NextResponse.json({ success: true }) } catch (error) { console.error("删除成员失败:", error) return NextResponse.json( { error: "删除成员失败" }, { status: 500 } ) } }