96 lines
2.2 KiB
TypeScript
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 }
|
|
)
|
|
}
|
|
}
|
|
|