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