Skip to content

Commit 6aafcce

Browse files
Update src/pages/api/courses/index.ts
Co-authored-by: Copilot <[email protected]>
1 parent 976dd8f commit 6aafcce

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

src/pages/api/courses/index.ts

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -67,27 +67,38 @@ async function handleGet(req: AuthenticatedRequest, res: NextApiResponse) {
6767
prisma.course.count({ where }),
6868
]);
6969

70-
// Calculate total lessons for each course
71-
const coursesWithCounts = await Promise.all(
72-
courses.map(async (course) => {
73-
const lessonCount = await prisma.lesson.count({
74-
where: {
75-
module: {
76-
courseId: course.id,
77-
},
78-
},
79-
});
80-
81-
return {
82-
...course,
83-
_count: {
84-
...course._count,
85-
lessons: lessonCount,
86-
},
87-
};
88-
})
89-
);
90-
70+
// Calculate total lessons for each course using a single groupBy query to avoid N+1 problem
71+
const courseIds = courses.map((course) => course.id);
72+
const lessonCounts = await prisma.lesson.groupBy({
73+
by: ['moduleId'],
74+
_count: { _all: true },
75+
where: {
76+
module: {
77+
courseId: { in: courseIds },
78+
},
79+
},
80+
});
81+
// Map moduleId to courseId
82+
const moduleCourseMap = await prisma.module.findMany({
83+
where: { courseId: { in: courseIds } },
84+
select: { id: true, courseId: true },
85+
});
86+
const moduleIdToCourseId = Object.fromEntries(moduleCourseMap.map(m => [m.id, m.courseId]));
87+
// Aggregate lesson counts per course
88+
const courseIdToLessonCount: Record<string, number> = {};
89+
for (const lc of lessonCounts) {
90+
const courseId = moduleIdToCourseId[lc.moduleId];
91+
if (courseId) {
92+
courseIdToLessonCount[courseId] = (courseIdToLessonCount[courseId] || 0) + lc._count._all;
93+
}
94+
}
95+
const coursesWithCounts = courses.map((course) => ({
96+
...course,
97+
_count: {
98+
...course._count,
99+
lessons: courseIdToLessonCount[course.id] || 0,
100+
},
101+
}));
91102
res.json({
92103
courses: coursesWithCounts,
93104
pagination: {

0 commit comments

Comments
 (0)