import { NextResponse } from "next/server" import { getServerSession } from "next-auth" import { authOptions } from "@/lib/auth" import { prisma } from "@/lib/prisma" // 检查是否为管理员 async function checkAdmin(userId: string) { const user = await prisma.user.findUnique({ where: { id: userId }, select: { isAdmin: true } }) return user?.isAdmin === true } // 获取所有用户及其家族统计信息 export async function GET() { try { const session = await getServerSession(authOptions) if (!session?.user?.id) { return NextResponse.json({ error: "未授权" }, { status: 401 }) } // 检查管理员权限 const isAdmin = await checkAdmin(session.user.id) if (!isAdmin) { return NextResponse.json({ error: "无权限访问" }, { status: 403 }) } // 获取所有用户及其拥有的家族树 const users = await prisma.user.findMany({ select: { id: true, email: true, name: true, avatar: true, isAdmin: true, isActive: true, createdAt: true, ownedTrees: { select: { id: true, name: true, createdAt: true, _count: { select: { members: true, }, }, // 获取该家族树的协作者 collaborators: { select: { role: true, user: { select: { id: true, name: true, email: true, } } } } }, }, // 获取用户作为协作者参与的家族树 collaborations: { select: { role: true, tree: { select: { id: true, name: true, owner: { select: { id: true, name: true, email: true, } } } } } } }, orderBy: [ { isAdmin: 'desc' }, // 管理员排在最前面 { createdAt: 'desc' }, ], }) // 格式化数据 const formattedUsers = users.map((user) => ({ id: user.id, email: user.email, name: user.name, avatar: user.avatar, isAdmin: user.isAdmin, isActive: user.isActive, createdAt: user.createdAt, treeCount: user.ownedTrees.length, totalMembers: user.ownedTrees.reduce((sum: number, tree) => sum + tree._count.members, 0), trees: user.ownedTrees.map((tree) => ({ id: tree.id, name: tree.name, createdAt: tree.createdAt, memberCount: tree._count.members, // 协作者列表 collaborators: tree.collaborators.map((c) => ({ id: c.user.id, name: c.user.name, email: c.user.email, role: c.role, })), })), // 作为协作者参与的家族 collaboratingTrees: user.collaborations.map((c) => ({ id: c.tree.id, name: c.tree.name, role: c.role, owner: { id: c.tree.owner.id, name: c.tree.owner.name, email: c.tree.owner.email, } })), })) // 统计总数 const stats = { totalUsers: users.length, totalTrees: formattedUsers.reduce((sum, user) => sum + user.treeCount, 0), totalMembers: formattedUsers.reduce((sum, user) => sum + user.totalMembers, 0), } return NextResponse.json({ users: formattedUsers, stats }) } catch (error) { console.error("获取用户列表失败:", error) return NextResponse.json( { error: "获取用户列表失败" }, { status: 500 } ) } }