From def5318c07faf966b2553fc96f3f40fcbfca6d08 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Mon, 15 Sep 2025 14:17:37 +0100 Subject: [PATCH] refactor: improve number rounding and handling in analytics calculations --- .../src/routes/api/analytics/user/+server.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/dashboard/src/routes/api/analytics/user/+server.ts b/apps/dashboard/src/routes/api/analytics/user/+server.ts index f7635190..badb55b7 100644 --- a/apps/dashboard/src/routes/api/analytics/user/+server.ts +++ b/apps/dashboard/src/routes/api/analytics/user/+server.ts @@ -39,7 +39,11 @@ export async function POST({ setHeaders, request }) { } function sumArrObject(arr: T[], key: keyof T) { - return arr.reduce((sum, item) => sum + (item[key] as number), 0); + return arr.reduce((sum, item) => sum + ((item[key] as number) || 0), 0); +} + +function roundNumber(a: number, b: number) { + return Math.round(a / b) * 100 || 0; } async function getLastLogin(userId: string): Promise { @@ -99,14 +103,14 @@ async function getAudienceData(userId: string, orgId: string): Promise acc + course.lessons_completed, 0 ); - const overallCourseProgress = Math.round((completedLessons / totalLessons) * 100); + const overallCourseProgress = roundNumber(completedLessons, totalLessons); const allGrades = sumArrObject(audienceAnalytics.courses, 'average_grade'); - const overallAverageGrade = Math.round(allGrades / audienceAnalytics.courses.length); + const overallAverageGrade = roundNumber(allGrades, audienceAnalytics.courses.length); audienceAnalytics.overallCourseProgress = overallCourseProgress; audienceAnalytics.overallAverageGrade = overallAverageGrade || 0; @@ -177,7 +181,7 @@ async function getStudentAnalyticsData( const totalEarnedPoints = sumArrObject(userExercisesStats, 'score'); const totalPoints = sumArrObject(userExercisesStats, 'totalPoints'); - userCourseAnalytics.averageGrade = Math.round((totalEarnedPoints / totalPoints) * 100); + userCourseAnalytics.averageGrade = roundNumber(totalEarnedPoints, totalPoints); userCourseAnalytics.userExercisesStats = userExercisesStats; const completedLessons = lessonCompletions.filter((lesson) => lesson.completed); @@ -185,8 +189,9 @@ async function getStudentAnalyticsData( userCourseAnalytics.totalExercises = exerciseResponse.data[0].exercises_count; userCourseAnalytics.completedExercises = exerciseResponse.data[0].exercises_completed; - userCourseAnalytics.progressPercentage = Math.round( - (completedLessons.length / lessonCompletions.length) * 100 + userCourseAnalytics.progressPercentage = roundNumber( + completedLessons.length, + lessonCompletions.length ); return userCourseAnalytics; @@ -202,7 +207,7 @@ async function fetchUserExercisesStats( .select( ` lesson!inner ( - title,exercise!inner ( + title,exercise!left ( id,title,lesson_id,created_at,question (points), submission!left ( id,total,status_id,submitted_by,groupmember!inner (id,profile_id)