69 lines
1.7 KiB
TypeScript

import { usePrisma } from "../../utils/prisma";
export default defineEventHandler(async (event) => {
const query = getQuery(event);
const gameName = String(query.game || "").toLowerCase();
const db = usePrisma();
const where = gameName ? { gameName } : {};
const [ratings, grouped] = await Promise.all([
db.gameRating.findMany({
where,
orderBy: { createdAt: "desc" },
take: 50,
select: {
id: true,
userId: true,
gameName: true,
stars: true,
feedback: true,
score: true,
createdAt: true,
},
}),
db.gameRating.groupBy({
by: ["gameName"],
where,
_avg: { stars: true },
_count: { id: true },
}),
]);
// Profil-Daten für alle User laden
const userIds = [...new Set(ratings.map((r) => r.userId))];
const profiles =
userIds.length > 0
? await db.profile.findMany({
where: { id: { in: userIds } },
select: { id: true, nickname: true, username: true, avatar: true },
})
: [];
const profileMap = Object.fromEntries(profiles.map((p) => [p.id, p]));
const ratingsWithUser = ratings.map((r) => {
const profile = profileMap[r.userId];
return {
id: r.id,
gameName: r.gameName,
stars: r.stars,
feedback: r.feedback,
score: r.score,
createdAt: r.createdAt,
user: {
nickname: profile?.nickname || profile?.username || "Anonym",
avatar: profile?.avatar ?? null,
},
};
});
const stats = grouped.map((g) => ({
gameName: g.gameName,
avgStars: Math.round((g._avg.stars ?? 0) * 10) / 10,
count: g._count.id,
}));
return { ratings: ratingsWithUser, stats };
});