Enhance VocabService and VocabLessonView for review lesson functionality

- Added logic in VocabService to retrieve vocabulary and lessons from previous lessons for review sessions, improving the learning experience.
- Implemented methods to gather review lessons and vocabulary exercises, ensuring users have access to relevant content during review lessons.
- Updated VocabLessonView to utilize review vocabulary exercises when in a review lesson, enhancing vocabulary extraction and user feedback.
- Improved console logging for better insights into the vocabulary processing flow, aiding in debugging and user interaction.
This commit is contained in:
Torsten Schulz (local)
2026-01-19 23:33:45 +01:00
parent fe2e6a53e9
commit 69ef120677
2 changed files with 105 additions and 13 deletions

View File

@@ -884,15 +884,92 @@ export default class VocabService {
} }
const plainLesson = lesson.get({ plain: true }); const plainLesson = lesson.get({ plain: true });
// Bei Wiederholungslektionen: Lade Vokabeln aus vorherigen Lektionen
if (plainLesson.lessonType === 'review' || plainLesson.lessonType === 'vocab_review') {
plainLesson.reviewLessons = await this._getReviewLessons(plainLesson.courseId, plainLesson.lessonNumber);
plainLesson.reviewVocabExercises = await this._getReviewVocabExercises(plainLesson.courseId, plainLesson.lessonNumber);
}
console.log(`[getLesson] Lektion ${lessonId} geladen:`, { console.log(`[getLesson] Lektion ${lessonId} geladen:`, {
id: plainLesson.id, id: plainLesson.id,
title: plainLesson.title, title: plainLesson.title,
lessonType: plainLesson.lessonType,
exerciseCount: plainLesson.grammarExercises ? plainLesson.grammarExercises.length : 0, exerciseCount: plainLesson.grammarExercises ? plainLesson.grammarExercises.length : 0,
exercises: plainLesson.grammarExercises reviewLessonsCount: plainLesson.reviewLessons ? plainLesson.reviewLessons.length : 0,
reviewVocabExercisesCount: plainLesson.reviewVocabExercises ? plainLesson.reviewVocabExercises.length : 0
}); });
return plainLesson; return plainLesson;
} }
/**
* Sammelt alle Lektionen, die in einer Wiederholungslektion wiederholt werden sollen
*/
async _getReviewLessons(courseId, currentLessonNumber) {
const lessons = await VocabCourseLesson.findAll({
where: {
courseId: courseId,
lessonNumber: {
[Op.lt]: currentLessonNumber // Nur Lektionen mit kleinerer Nummer
},
lessonType: {
[Op.notIn]: ['review', 'vocab_review'] // Keine anderen Wiederholungslektionen
}
},
order: [['lessonNumber', 'ASC']],
attributes: ['id', 'lessonNumber', 'title']
});
return lessons.map(l => l.get({ plain: true }));
}
/**
* Sammelt alle Grammatik-Übungen aus vorherigen Lektionen für Wiederholungslektionen
*/
async _getReviewVocabExercises(courseId, currentLessonNumber) {
const previousLessons = await VocabCourseLesson.findAll({
where: {
courseId: courseId,
lessonNumber: {
[Op.lt]: currentLessonNumber
},
lessonType: {
[Op.notIn]: ['review', 'vocab_review']
}
},
attributes: ['id']
});
if (previousLessons.length === 0) {
return [];
}
const lessonIds = previousLessons.map(l => l.id);
const exercises = await VocabGrammarExercise.findAll({
where: {
lessonId: {
[Op.in]: lessonIds
}
},
include: [
{
model: VocabGrammarExerciseType,
as: 'exerciseType'
},
{
model: VocabCourseLesson,
as: 'lesson',
attributes: ['id', 'lessonNumber', 'title']
}
],
order: [
[{ model: VocabCourseLesson, as: 'lesson' }, 'lessonNumber', 'ASC'],
['exerciseNumber', 'ASC']
]
});
return exercises.map(e => e.get({ plain: true }));
}
async addLessonToCourse(hashedUserId, courseId, { chapterId, lessonNumber, title, description, weekNumber, dayNumber, lessonType, audioUrl, culturalNotes, targetMinutes, targetScorePercent, requiresReview }) { async addLessonToCourse(hashedUserId, courseId, { chapterId, lessonNumber, title, description, weekNumber, dayNumber, lessonType, audioUrl, culturalNotes, targetMinutes, targetScorePercent, requiresReview }) {
const user = await this._getUserByHashedId(hashedUserId); const user = await this._getUserByHashedId(hashedUserId);
const course = await VocabCourse.findByPk(courseId); const course = await VocabCourse.findByPk(courseId);

View File

@@ -390,14 +390,33 @@ export default {
importantVocab() { importantVocab() {
// Extrahiere wichtige Begriffe aus den Übungen // Extrahiere wichtige Begriffe aus den Übungen
try { try {
// Bei Wiederholungslektionen: Verwende Vokabeln aus vorherigen Lektionen
if (this.lesson && (this.lesson.lessonType === 'review' || this.lesson.lessonType === 'vocab_review')) {
if (this.lesson.reviewVocabExercises && Array.isArray(this.lesson.reviewVocabExercises)) {
console.log('[importantVocab] Wiederholungslektion - verwende reviewVocabExercises:', this.lesson.reviewVocabExercises.length);
return this._extractVocabFromExercises(this.lesson.reviewVocabExercises);
} else {
console.log('[importantVocab] Wiederholungslektion aber keine reviewVocabExercises vorhanden');
return [];
}
}
// Normale Lektion: Verwende Übungen aus der aktuellen Lektion
if (!this.lesson || !this.lesson.grammarExercises || !Array.isArray(this.lesson.grammarExercises)) { if (!this.lesson || !this.lesson.grammarExercises || !Array.isArray(this.lesson.grammarExercises)) {
console.log('[importantVocab] Keine Übungen vorhanden'); console.log('[importantVocab] Keine Übungen vorhanden');
return []; return [];
} }
return this._extractVocabFromExercises(this.lesson.grammarExercises);
} catch (e) {
console.error('Fehler in importantVocab computed property:', e);
return [];
}
},
_extractVocabFromExercises(exercises) {
const vocabMap = new Map(); const vocabMap = new Map();
this.lesson.grammarExercises.forEach((exercise, idx) => { exercises.forEach((exercise, idx) => {
try { try {
console.log(`[importantVocab] Verarbeite Übung ${idx + 1}:`, exercise.title); console.log(`[importantVocab] Verarbeite Übung ${idx + 1}:`, exercise.title);
// Extrahiere aus questionData // Extrahiere aus questionData
@@ -472,12 +491,8 @@ export default {
}); });
const result = Array.from(vocabMap.values()); const result = Array.from(vocabMap.values());
console.log(`[importantVocab] Ergebnis:`, result); console.log(`[_extractVocabFromExercises] Ergebnis:`, result.length, 'Vokabeln');
return result; return result;
} catch (e) {
console.error('Fehler in importantVocab computed property:', e);
return [];
}
} }
}, },
watch: { watch: {