From a799769af2d7c85945badb65a7a0515d4c2b4c5c Mon Sep 17 00:00:00 2001 From: falendikategar Date: Thu, 17 Oct 2024 09:20:58 +0700 Subject: [PATCH] update: revision for endpoint get average score aspect and grouping sub aspect, revision permission access for assessments --- apps/backend/src/data/permissions.ts | 9 +- apps/backend/src/routes/assessments/route.ts | 91 +++++++++++++------- 2 files changed, 65 insertions(+), 35 deletions(-) diff --git a/apps/backend/src/data/permissions.ts b/apps/backend/src/data/permissions.ts index 1054709..d938373 100644 --- a/apps/backend/src/data/permissions.ts +++ b/apps/backend/src/data/permissions.ts @@ -83,13 +83,16 @@ const permissionsData = [ { code: "assessmentResult.create", }, - { + { code: "assessmentRequest.read", }, { code: "assessmentRequest.create", - }, - { + }, + { + code: "assessments.readAspect", + }, + { code: "assessments.readAssessmentScore", }, { diff --git a/apps/backend/src/routes/assessments/route.ts b/apps/backend/src/routes/assessments/route.ts index 8e423a3..3f6a7d9 100644 --- a/apps/backend/src/routes/assessments/route.ts +++ b/apps/backend/src/routes/assessments/route.ts @@ -45,7 +45,7 @@ const assessmentsRoute = new Hono() // Get all aspects .get( "/aspect", - // checkPermission("managementAspect.readAll"), + checkPermission("assessments.readAspect"), requestValidator( "query", z.object({ @@ -172,7 +172,7 @@ const assessmentsRoute = new Hono() // Get data for current Assessment Score from submitted options By Assessment Id .get( "/getCurrentAssessmentScore", - // checkPermission("assessments.readAssessmentScore"), + checkPermission("assessments.readAssessmentScore"), requestValidator( "query", z.object({ @@ -599,7 +599,7 @@ const assessmentsRoute = new Hono() // Get data for One Sub Aspect average score By Sub Aspect Id and Assessment Id .get( '/average-score/sub-aspects/:subAspectId/assessments/:assessmentId', - // checkPermission("assessments.readAssessmentScore"), + checkPermission("assessments.readAssessmentScore"), async (c) => { const { subAspectId, assessmentId } = c.req.param(); @@ -630,7 +630,7 @@ const assessmentsRoute = new Hono() // Get data for All Sub Aspects average score By Assessment Id .get( '/average-score/sub-aspects/assessments/:assessmentId', - // checkPermission("assessments.readAssessmentScore"), + checkPermission("assessments.readAssessmentScore"), async (c) => { const { assessmentId } = c.req.param(); @@ -664,7 +664,7 @@ const assessmentsRoute = new Hono() // Get data for One Aspect average score By Aspect Id and Assessment Id .get( "/average-score/aspects/:aspectId/assessments/:assessmentId", - // checkPermission("assessments.readAverageAspect"), + checkPermission("assessments.readAssessmentScore"), async (c) => { const { aspectId, assessmentId } = c.req.param(); @@ -693,36 +693,63 @@ const assessmentsRoute = new Hono() } ) - // Get data for All Aspects average score By Assessment Id + // Get data for Aspects average score and all related Sub Aspects average score By Assessment Id .get( '/average-score/aspects/assessments/:assessmentId', - // checkPermission("assessments.readAssessmentScore"), + checkPermission("assessments.readAssessmentScore"), async (c) => { - const { assessmentId } = c.req.param(); - - const averageScores = await db - .select({ - AspectId: aspects.id, - AspectName: aspects.name, - average: sql`AVG(options.score)` - }) - .from(answers) - .innerJoin(options, eq(answers.optionId, options.id)) - .innerJoin(questions, eq(options.questionId, questions.id)) - .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) - .innerJoin(aspects, eq(subAspects.aspectId, aspects.id)) - .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) - .where(eq(assessments.id, assessmentId)) - .groupBy(aspects.id); - - return c.json({ - assessmentId, - aspects: averageScores.map(score => ({ - AspectId: score.AspectId, - AspectName: score.AspectName, - averageScore: score.average - })) - }); + const { assessmentId } = c.req.param(); + + // Query untuk mendapatkan average score per aspect + const aspectScores = await db + .select({ + aspectId: aspects.id, + aspectName: aspects.name, + averageScore: sql`AVG(options.score)`, + }) + .from(answers) + .innerJoin(options, eq(answers.optionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(aspects, eq(subAspects.aspectId, aspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(aspects.id); + + // Query untuk mendapatkan average score per sub-aspect + const subAspectScores = await db + .select({ + aspectId: subAspects.aspectId, + subAspectId: subAspects.id, + subAspectName: subAspects.name, + averageScore: sql`AVG(options.score)`, + }) + .from(answers) + .innerJoin(options, eq(answers.optionId, options.id)) + .innerJoin(questions, eq(options.questionId, questions.id)) + .innerJoin(subAspects, eq(questions.subAspectId, subAspects.id)) + .innerJoin(assessments, eq(answers.assessmentId, assessments.id)) + .where(eq(assessments.id, assessmentId)) + .groupBy(subAspects.id); + + // Menggabungkan sub-aspects ke dalam masing-masing aspect + const aspectsWithSubAspects = aspectScores.map((aspect) => ({ + aspectId: aspect.aspectId, + aspectName: aspect.aspectName, + averageScore: aspect.averageScore, + subAspects: subAspectScores + .filter((sub) => sub.aspectId === aspect.aspectId) + .map((sub) => ({ + subAspectId: sub.subAspectId, + subAspectName: sub.subAspectName, + averageScore: sub.averageScore, + })), + })); + + return c.json({ + assessmentId, + aspects: aspectsWithSubAspects, + }); } )