@@ -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