diff --git a/apps/backend/src/routes/assessments/route.ts b/apps/backend/src/routes/assessments/route.ts index 701f5b2..a8ee072 100644 --- a/apps/backend/src/routes/assessments/route.ts +++ b/apps/backend/src/routes/assessments/route.ts @@ -28,6 +28,7 @@ export const answerFormSchema = z.object({ export const optionFormSchema = z.object({ optionId: z.string().min(1), assessmentId: z.string().min(1), + questionId: z.string().min(1), isFlagged: z.boolean().optional().default(false), filename: z.string().optional(), }); @@ -582,36 +583,38 @@ const assessmentsRoute = new Hono() .post( "/submitOption", - // checkPermission("assessments.submitAnswer"), + // checkPermission("assessments.submitOption"), requestValidator("json", optionFormSchema), async (c) => { const optionData = c.req.valid("json"); - // Cek apakah jawaban sudah ada berdasarkan assessmentId dan optionId + // Cek apakah jawaban sudah ada berdasarkan assessmentId dan questionId const existingAnswer = await db - .select() - .from(answers) - .where( - sql`answers.assessmentId = ${optionData.assessmentId} - AND answers.optionId = ${optionData.optionId}` - ) // Asumsi optionId berkaitan dengan questionId - .limit(1); + .select() + .from(answers) + .leftJoin(options, eq(answers.optionId, options.id)) + .leftJoin(questions, eq(options.questionId, questions.id)) + .where( + sql`answers."assessmentId" = ${optionData.assessmentId} + AND questions.id = ${optionData.questionId}` + ) + .limit(1); let answer; if (existingAnswer.length > 0) { // Update jika jawaban sudah ada answer = await db - .update(answers) - .set({ - optionId: optionData.optionId, // Ubah ke pilihan baru - isFlagged: optionData.isFlagged ?? existingAnswer[0].isFlagged, // Pertahankan flag jika tidak diubah - filename: optionData.filename ?? existingAnswer[0].filename // Pertahankan filename jika tidak diubah - }) - .where( - sql`answers.assessmentId = ${optionData.assessmentId} - AND answers.optionId = ${optionData.optionId}` - ) // Tambahkan kondisi untuk questionId - .returning(); + .update(answers) + .set({ + optionId: optionData.optionId, // Ubah ke pilihan baru + }) + .where( + sql`answers."assessmentId" = ${optionData.assessmentId} + AND answers."optionId" IN ( + SELECT id FROM options WHERE "questionId" = ${optionData.questionId} + )` // Mendapatkan optionId berdasarkan questionId + ) + .returning(); } else { // Insert jika belum ada jawaban answer = await db @@ -634,7 +637,7 @@ const assessmentsRoute = new Hono() 201 ); } - ) + ) .post( "/submitValidation",