backend: accept parenthetical variants in answer checking (use _isEquivalentAnswer)
Some checks failed
Deploy to production / deploy (push) Has been cancelled

This commit is contained in:
Torsten Schulz (local)
2026-05-21 10:51:36 +02:00
parent 4abed5263e
commit 504a32a746

View File

@@ -4065,21 +4065,19 @@ export default class VocabService {
// Für Lückentext: Normalisiere und vergleiche
if (exerciseTypeId === 1) { // gap_fill
const normalize = (str) => String(str || '').trim().toLowerCase();
const correctAnswers = parsedAnswerData.answers || parsedAnswerData.correct || [];
const correctAnswersArray = Array.isArray(correctAnswers) ? correctAnswers : [correctAnswers];
// userAnswer ist ein Array von Antworten
if (Array.isArray(userAnswer)) {
if (userAnswer.length !== correctAnswersArray.length) return false;
return userAnswer.every((ans, idx) => {
const correct = correctAnswersArray[idx];
return normalize(ans) === normalize(correct);
return this._isEquivalentAnswer(ans, correct);
});
} else {
// Fallback: Einzelne Antwort
const normalizedUserAnswer = normalize(userAnswer);
return correctAnswersArray.some(correct => normalize(correct) === normalizedUserAnswer);
return correctAnswersArray.some((correct) => this._isEquivalentAnswer(userAnswer, correct));
}
}
@@ -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') {
const candidateAnswers = parsedAnswerData.correct ?? parsedAnswerData.correctAnswer ?? parsedAnswerData.answers ?? parsedAnswerData.modelAnswer ?? [];
const normalizedUser = this._normalizeTextAnswer(userAnswer);
const answers = Array.isArray(candidateAnswers) ? candidateAnswers : [candidateAnswers];
if (parsedQuestionData.type === 'situational_response') {
const keywords = parsedQuestionData.keywords || parsedAnswerData.keywords || [];
if (keywords.length > 0) {
const normalizedUser = this._normalizeTextAnswer(userAnswer);
return keywords.every((keyword) => normalizedUser.includes(this._normalizeTextAnswer(keyword)));
}
}
return answers
.map((answer) => this._normalizeTextAnswer(answer))
.filter(Boolean)
.some((answer) => answer === normalizedUser);
.some((answer) => this._isEquivalentAnswer(userAnswer, answer));
}
// Für andere Typen: einfacher String-Vergleich inkl. hinterlegter Alternativen
@@ -4133,8 +4130,9 @@ export default class VocabService {
? parsedAnswerData.alternatives
: [];
const correctAnswersArray = [...primaryAnswersArray, ...alternativeAnswersArray];
const normalizedUserAnswer = this._normalizeTextAnswer(userAnswer);
return correctAnswersArray.some(correct => this._normalizeTextAnswer(correct) === normalizedUserAnswer);
return correctAnswersArray
.filter(Boolean)
.some((correct) => this._isEquivalentAnswer(userAnswer, correct));
}
async getGrammarExerciseProgress(hashedUserId, lessonId) {