2025-10-26 09:11:04 +08:00

96 lines
2.2 KiB
TypeScript

import { NextResponse } from 'next/server'
import { prisma } from '@/lib/prisma'
// 获取排行榜数据
export async function GET() {
try {
// 1. 贡献排行榜(上传素材数量最多)
const contributors = await prisma.user.findMany({
select: {
username: true,
_count: {
select: {
materials: true,
},
},
},
orderBy: {
materials: {
_count: 'desc',
},
},
take: 10,
})
// 2. 下载排行榜(素材被下载次数最多的作者)
const downloadRankings = await prisma.material.groupBy({
by: ['userId'],
_sum: {
downloadCount: true,
},
orderBy: {
_sum: {
downloadCount: 'desc',
},
},
take: 10,
})
const downloadUsers = await Promise.all(
downloadRankings.map(async (item) => {
const user = await prisma.user.findUnique({
where: { id: item.userId },
select: { username: true },
})
return {
username: user?.username || '未知用户',
count: item._sum.downloadCount || 0,
}
})
)
// 3. 点赞排行榜(素材被点赞次数最多的作者)
const likeRankings = await prisma.material.groupBy({
by: ['userId'],
_sum: {
likeCount: true,
},
orderBy: {
_sum: {
likeCount: 'desc',
},
},
take: 10,
})
const likeUsers = await Promise.all(
likeRankings.map(async (item) => {
const user = await prisma.user.findUnique({
where: { id: item.userId },
select: { username: true },
})
return {
username: user?.username || '未知用户',
count: item._sum.likeCount || 0,
}
})
)
return NextResponse.json({
contributors: contributors.map((user) => ({
username: user.username,
count: user._count.materials,
})),
downloads: downloadUsers,
likes: likeUsers,
})
} catch (error) {
console.error('Error fetching rankings:', error)
return NextResponse.json(
{ error: '获取排行榜失败' },
{ status: 500 }
)
}
}