全项目扫描修复: Docker数据卷修复+安全requireAdmin+12页SEO+API白名单+脚本超时+常量提取+假数据删除
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { NextResponse } from "next/server";
|
||||
import { getLevelInfo } from "@/lib/level-config";
|
||||
|
||||
export async function GET(_req: Request, { params }: { params: { id: string } }) {
|
||||
try {
|
||||
const userId = parseInt(params.id);
|
||||
if (isNaN(userId)) {
|
||||
return NextResponse.json({ error: "无效的用户ID" }, { status: 400 });
|
||||
}
|
||||
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: userId },
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
email: true,
|
||||
bio: true,
|
||||
avatarUrl: true,
|
||||
points: true,
|
||||
level: true,
|
||||
role: true,
|
||||
isBot: true,
|
||||
createdAt: true,
|
||||
_count: {
|
||||
select: {
|
||||
forumTopics: true,
|
||||
forumPosts: true,
|
||||
comments: true,
|
||||
favorites: true,
|
||||
topicLikes: true,
|
||||
postLikes: true,
|
||||
topicBookmarks: true,
|
||||
categoryFollows: true,
|
||||
},
|
||||
},
|
||||
achievements: {
|
||||
include: {
|
||||
achievement: { select: { key: true, name: true, icon: true, tier: true } },
|
||||
},
|
||||
orderBy: { unlockedAt: "desc" },
|
||||
take: 6,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return NextResponse.json({ error: "用户不存在" }, { status: 404 });
|
||||
}
|
||||
|
||||
const [bestAnswerCount, totalLikesReceived, checkInStreak, followCount] = await Promise.all([
|
||||
prisma.forumPost.count({
|
||||
where: { userId, isAnswer: true },
|
||||
}),
|
||||
prisma.forumPost.aggregate({
|
||||
where: { userId },
|
||||
_sum: { likeCount: true },
|
||||
}),
|
||||
prisma.forumCheckIn.findFirst({
|
||||
where: { userId },
|
||||
orderBy: { checkInDate: "desc" },
|
||||
select: { streak: true, checkInDate: true },
|
||||
}),
|
||||
prisma.forumCategoryFollow.count({
|
||||
where: { userId },
|
||||
}),
|
||||
]);
|
||||
|
||||
const levelInfo = getLevelInfo(user.points);
|
||||
|
||||
return NextResponse.json({
|
||||
id: user.id,
|
||||
name: user.name,
|
||||
email: user.email,
|
||||
bio: user.bio,
|
||||
avatarUrl: user.avatarUrl,
|
||||
points: user.points,
|
||||
level: user.level,
|
||||
role: user.role,
|
||||
isBot: user.isBot,
|
||||
createdAt: user.createdAt,
|
||||
levelInfo,
|
||||
stats: {
|
||||
topicCount: user._count.forumTopics,
|
||||
postCount: user._count.forumPosts,
|
||||
commentCount: user._count.comments,
|
||||
favoriteCount: user._count.favorites,
|
||||
bookmarkCount: user._count.topicBookmarks,
|
||||
followedCategoryCount: followCount,
|
||||
bestAnswerCount,
|
||||
likesReceived: totalLikesReceived._sum.likeCount || 0,
|
||||
checkInStreak: checkInStreak?.streak || 0,
|
||||
lastCheckInDate: checkInStreak?.checkInDate || null,
|
||||
},
|
||||
achievements: user.achievements.map(a => ({
|
||||
key: a.achievement.key,
|
||||
name: a.achievement.name,
|
||||
icon: a.achievement.icon,
|
||||
tier: a.achievement.tier,
|
||||
progress: a.progress,
|
||||
unlockedAt: a.unlockedAt,
|
||||
})),
|
||||
});
|
||||
} catch (error: unknown) {
|
||||
const err = error as { message?: string };
|
||||
return NextResponse.json({ error: err.message || "获取用户资料失败" }, { status: 500 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user