From 026730c0770c8c322ce27c03dea2159064e34b6b Mon Sep 17 00:00:00 2001 From: Tiago Ribeiro Date: Wed, 3 Jan 2024 15:32:51 +0000 Subject: [PATCH] Updated the evaluation to work recursively when failing --- src/components/Exercises/Writing.tsx | 4 ++-- src/pages/api/evaluate/speaking.ts | 23 +++++++++++++---------- src/pages/api/evaluate/writing.ts | 13 ++++++++++--- src/utils/evaluation.ts | 2 +- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/components/Exercises/Writing.tsx b/src/components/Exercises/Writing.tsx index 0edf3689..1ba75275 100644 --- a/src/components/Exercises/Writing.tsx +++ b/src/components/Exercises/Writing.tsx @@ -93,8 +93,8 @@ export default function Writing({ )}
- {prefix} - {prompt} + {prefix.replaceAll("\\n", "\n")} + {prompt.replaceAll("\\n", "\n")} {attachment && ( setIsModalOpen(true)} diff --git a/src/pages/api/evaluate/speaking.ts b/src/pages/api/evaluate/speaking.ts index f7865836..2706f9d9 100644 --- a/src/pages/api/evaluate/speaking.ts +++ b/src/pages/api/evaluate/speaking.ts @@ -2,7 +2,7 @@ import type {NextApiRequest, NextApiResponse} from "next"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; -import axios from "axios"; +import axios, {AxiosResponse} from "axios"; import formidable from "formidable-serverless"; import {ref, uploadBytes} from "firebase/storage"; import fs from "fs"; @@ -26,21 +26,24 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { const binary = fs.readFileSync((audioFile as any).path).buffer; const snapshot = await uploadBytes(audioFileRef, binary); - const backendRequest = await axios.post( - `${process.env.BACKEND_URL}/speaking_task_3`, - {answers: [{question: fields.question, answer: snapshot.metadata.fullPath}]}, - { - headers: { - Authorization: `Bearer ${process.env.BACKEND_JWT}`, - }, - }, - ); + const backendRequest = await evaluate({answers: [{question: fields.question, answer: snapshot.metadata.fullPath}]}); fs.rmSync((audioFile as any).path); res.status(200).json({...backendRequest.data, fullPath: snapshot.metadata.fullPath}); }); } +async function evaluate(body: {answers: object[]}): Promise { + const backendRequest = await axios.post(`${process.env.BACKEND_URL}/speaking_task_3`, body, { + headers: { + Authorization: `Bearer ${process.env.BACKEND_JWT}`, + }, + }); + + if (typeof backendRequest.data === "string") return evaluate(body); + return backendRequest; +} + export const config = { api: { bodyParser: false, diff --git a/src/pages/api/evaluate/writing.ts b/src/pages/api/evaluate/writing.ts index bc5812c0..40c84958 100644 --- a/src/pages/api/evaluate/writing.ts +++ b/src/pages/api/evaluate/writing.ts @@ -3,7 +3,7 @@ import type {NextApiRequest, NextApiResponse} from "next"; import {getFirestore, doc, getDoc} from "firebase/firestore"; import {withIronSessionApiRoute} from "iron-session/next"; import {sessionOptions} from "@/lib/session"; -import axios from "axios"; +import axios, {AxiosResponse} from "axios"; interface Body { question: string; @@ -18,11 +18,18 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { return; } - const backendRequest = await axios.post(`${process.env.BACKEND_URL}/writing_task2`, req.body as Body, { + const backendRequest = await evaluate(req.body as Body); + + res.status(backendRequest.status).json(backendRequest.data); +} + +async function evaluate(body: Body): Promise { + const backendRequest = await axios.post(`${process.env.BACKEND_URL}/writing_task2`, body as Body, { headers: { Authorization: `Bearer ${process.env.BACKEND_JWT}`, }, }); - res.status(backendRequest.status).json(backendRequest.data); + if (typeof backendRequest.data === "string") return evaluate(body); + return backendRequest; } diff --git a/src/utils/evaluation.ts b/src/utils/evaluation.ts index dd254cba..55bec84f 100644 --- a/src/utils/evaluation.ts +++ b/src/utils/evaluation.ts @@ -11,7 +11,7 @@ import { import axios from "axios"; import {speakingReverseMarking, writingReverseMarking} from "./score"; -export const evaluateWritingAnswer = async (exercise: WritingExercise, solution: UserSolution) => { +export const evaluateWritingAnswer = async (exercise: WritingExercise, solution: UserSolution): Promise => { const response = await axios.post("/api/evaluate/writing", { question: `${exercise.prompt} ${exercise.attachment ? exercise.attachment.description : ""}`.replaceAll("\n", ""), answer: solution.solutions[0].solution.trim().replaceAll("\n", " "),