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 });
// 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:`, {
id: plainLesson.id,
title: plainLesson.title,
lessonType: plainLesson.lessonType,
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;
}
/**
* 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 }) {
const user = await this._getUserByHashedId(hashedUserId);
const course = await VocabCourse.findByPk(courseId);