backend: accept parenthetical variants in answer checking (use _isEquivalentAnswer)
Some checks failed
Deploy to production / deploy (push) Has been cancelled
Some checks failed
Deploy to production / deploy (push) Has been cancelled
This commit is contained in:
@@ -4065,21 +4065,19 @@ export default class VocabService {
|
|||||||
|
|
||||||
// Für Lückentext: Normalisiere und vergleiche
|
// Für Lückentext: Normalisiere und vergleiche
|
||||||
if (exerciseTypeId === 1) { // gap_fill
|
if (exerciseTypeId === 1) { // gap_fill
|
||||||
const normalize = (str) => String(str || '').trim().toLowerCase();
|
|
||||||
const correctAnswers = parsedAnswerData.answers || parsedAnswerData.correct || [];
|
const correctAnswers = parsedAnswerData.answers || parsedAnswerData.correct || [];
|
||||||
const correctAnswersArray = Array.isArray(correctAnswers) ? correctAnswers : [correctAnswers];
|
const correctAnswersArray = Array.isArray(correctAnswers) ? correctAnswers : [correctAnswers];
|
||||||
|
|
||||||
// userAnswer ist ein Array von Antworten
|
// userAnswer ist ein Array von Antworten
|
||||||
if (Array.isArray(userAnswer)) {
|
if (Array.isArray(userAnswer)) {
|
||||||
if (userAnswer.length !== correctAnswersArray.length) return false;
|
if (userAnswer.length !== correctAnswersArray.length) return false;
|
||||||
return userAnswer.every((ans, idx) => {
|
return userAnswer.every((ans, idx) => {
|
||||||
const correct = correctAnswersArray[idx];
|
const correct = correctAnswersArray[idx];
|
||||||
return normalize(ans) === normalize(correct);
|
return this._isEquivalentAnswer(ans, correct);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// Fallback: Einzelne Antwort
|
// Fallback: Einzelne Antwort
|
||||||
const normalizedUserAnswer = normalize(userAnswer);
|
return correctAnswersArray.some((correct) => this._isEquivalentAnswer(userAnswer, correct));
|
||||||
return correctAnswersArray.some(correct => normalize(correct) === normalizedUserAnswer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4110,20 +4108,19 @@ export default class VocabService {
|
|||||||
|
|
||||||
if (parsedQuestionData.type === 'sentence_building' || parsedQuestionData.type === 'dialog_completion' || parsedQuestionData.type === 'situational_response' || parsedQuestionData.type === 'pattern_drill') {
|
if (parsedQuestionData.type === 'sentence_building' || parsedQuestionData.type === 'dialog_completion' || parsedQuestionData.type === 'situational_response' || parsedQuestionData.type === 'pattern_drill') {
|
||||||
const candidateAnswers = parsedAnswerData.correct ?? parsedAnswerData.correctAnswer ?? parsedAnswerData.answers ?? parsedAnswerData.modelAnswer ?? [];
|
const candidateAnswers = parsedAnswerData.correct ?? parsedAnswerData.correctAnswer ?? parsedAnswerData.answers ?? parsedAnswerData.modelAnswer ?? [];
|
||||||
const normalizedUser = this._normalizeTextAnswer(userAnswer);
|
|
||||||
const answers = Array.isArray(candidateAnswers) ? candidateAnswers : [candidateAnswers];
|
const answers = Array.isArray(candidateAnswers) ? candidateAnswers : [candidateAnswers];
|
||||||
|
|
||||||
if (parsedQuestionData.type === 'situational_response') {
|
if (parsedQuestionData.type === 'situational_response') {
|
||||||
const keywords = parsedQuestionData.keywords || parsedAnswerData.keywords || [];
|
const keywords = parsedQuestionData.keywords || parsedAnswerData.keywords || [];
|
||||||
if (keywords.length > 0) {
|
if (keywords.length > 0) {
|
||||||
|
const normalizedUser = this._normalizeTextAnswer(userAnswer);
|
||||||
return keywords.every((keyword) => normalizedUser.includes(this._normalizeTextAnswer(keyword)));
|
return keywords.every((keyword) => normalizedUser.includes(this._normalizeTextAnswer(keyword)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return answers
|
return answers
|
||||||
.map((answer) => this._normalizeTextAnswer(answer))
|
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.some((answer) => answer === normalizedUser);
|
.some((answer) => this._isEquivalentAnswer(userAnswer, answer));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Für andere Typen: einfacher String-Vergleich inkl. hinterlegter Alternativen
|
// Für andere Typen: einfacher String-Vergleich inkl. hinterlegter Alternativen
|
||||||
@@ -4133,8 +4130,9 @@ export default class VocabService {
|
|||||||
? parsedAnswerData.alternatives
|
? parsedAnswerData.alternatives
|
||||||
: [];
|
: [];
|
||||||
const correctAnswersArray = [...primaryAnswersArray, ...alternativeAnswersArray];
|
const correctAnswersArray = [...primaryAnswersArray, ...alternativeAnswersArray];
|
||||||
const normalizedUserAnswer = this._normalizeTextAnswer(userAnswer);
|
return correctAnswersArray
|
||||||
return correctAnswersArray.some(correct => this._normalizeTextAnswer(correct) === normalizedUserAnswer);
|
.filter(Boolean)
|
||||||
|
.some((correct) => this._isEquivalentAnswer(userAnswer, correct));
|
||||||
}
|
}
|
||||||
|
|
||||||
async getGrammarExerciseProgress(hashedUserId, lessonId) {
|
async getGrammarExerciseProgress(hashedUserId, lessonId) {
|
||||||
|
|||||||
Reference in New Issue
Block a user