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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user