Fix quiz attempts page: fetch users separately (no User relation on QuizAttempt)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-27 12:07:28 +05:00
parent 2468671d82
commit ba0a630fd9
+12 -14
View File
@@ -13,20 +13,13 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
where: { id: quizId }, where: { id: quizId },
include: { include: {
questions: { orderBy: { order: "asc" } }, questions: { orderBy: { order: "asc" } },
attempts: { attempts: { orderBy: { completedAt: "desc" } },
orderBy: { completedAt: "desc" },
include: {
user: { select: { name: true, email: true } },
},
},
lesson: { lesson: {
select: { select: {
id: true,
title: true, title: true,
module: { module: {
select: { select: {
id: true, course: { select: { title: true } },
course: { select: { id: true, title: true } },
}, },
}, },
}, },
@@ -36,8 +29,12 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
if (!quiz) notFound(); if (!quiz) notFound();
const courseId = quiz.lesson.module.course.id; const userIds = [...new Set(quiz.attempts.map((a) => a.userId))];
const moduleId = quiz.lesson.module.id; const users = await prisma.user.findMany({
where: { id: { in: userIds } },
select: { id: true, name: true, email: true },
});
const userMap = Object.fromEntries(users.map((u) => [u.id, u]));
return ( return (
<div className="p-8 max-w-4xl"> <div className="p-8 max-w-4xl">
@@ -67,6 +64,7 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
<div className="space-y-4"> <div className="space-y-4">
{quiz.attempts.map((attempt) => { {quiz.attempts.map((attempt) => {
const answers = attempt.answers as Record<string, string>; const answers = attempt.answers as Record<string, string>;
const user = userMap[attempt.userId];
const date = new Date(attempt.completedAt).toLocaleString("ru-RU", { const date = new Date(attempt.completedAt).toLocaleString("ru-RU", {
day: "2-digit", day: "2-digit",
month: "2-digit", month: "2-digit",
@@ -83,9 +81,9 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
> >
<div className="flex items-center justify-between gap-2"> <div className="flex items-center justify-between gap-2">
<div> <div>
<p className="text-sm font-medium">{attempt.user.name}</p> <p className="text-sm font-medium">{user?.name ?? "—"}</p>
<p className="text-xs" style={{ color: "var(--muted-foreground)" }}> <p className="text-xs" style={{ color: "var(--muted-foreground)" }}>
{attempt.user.email} {user?.email ?? attempt.userId}
</p> </p>
</div> </div>
<span className="text-xs" style={{ color: "var(--muted-foreground)" }}> <span className="text-xs" style={{ color: "var(--muted-foreground)" }}>
@@ -93,7 +91,7 @@ export default async function AdminQuizAttemptsPage({ params }: Props) {
</span> </span>
</div> </div>
<div className="space-y-2 pt-1" style={{ borderTop: "1px solid var(--border)" }}> <div className="space-y-2 pt-2" style={{ borderTop: "1px solid var(--border)" }}>
{quiz.questions.map((q, idx) => ( {quiz.questions.map((q, idx) => (
<div key={q.id}> <div key={q.id}>
<p <p