#!/usr/bin/env node import { sequelize } from '../utils/sequelize.js'; import VocabCourse from '../models/community/vocab_course.js'; import VocabCourseLesson from '../models/community/vocab_course_lesson.js'; import { GERMAN_FOR_BISAYA_PHASE4_DIDACTICS, GERMAN_FOR_BISAYA_PHASE4_LESSONS } from './german-for-bisaya-phase4-extension.js'; import { getGermanForBisayaLessonPedagogy, getGermanForBisayaProgressTargets } from './german-for-bisaya-phase2-pedagogy.js'; async function getLanguageId(name) { const [language] = await sequelize.query( `SELECT id FROM community.vocab_language WHERE name = :name LIMIT 1`, { replacements: { name }, type: sequelize.QueryTypes.SELECT } ); if (!language) throw new Error(`Sprache "${name}" nicht gefunden`); return Number(language.id); } async function extendGermanForBisayaPhase4() { await sequelize.authenticate(); const germanLanguageId = await getLanguageId('Deutsch'); const bisayaLanguageId = await getLanguageId('Bisaya'); const courses = await VocabCourse.findAll({ where: { languageId: germanLanguageId, nativeLanguageId: bisayaLanguageId } }); for (const course of courses) { if (!String(course.title || '').startsWith('Deutsch für Bisaya-Lernende')) continue; for (const lessonData of GERMAN_FOR_BISAYA_PHASE4_LESSONS) { const existing = await VocabCourseLesson.findOne({ where: { courseId: course.id, lessonNumber: lessonData.num } }); if (existing) continue; const didactics = GERMAN_FOR_BISAYA_PHASE4_DIDACTICS[lessonData.title] || {}; const pedagogy = getGermanForBisayaLessonPedagogy(lessonData.num, lessonData.type, lessonData.title); const progressTargets = getGermanForBisayaProgressTargets(lessonData, pedagogy); await VocabCourseLesson.create({ courseId: course.id, chapterId: null, lessonNumber: lessonData.num, title: lessonData.title, description: lessonData.desc, weekNumber: lessonData.week, dayNumber: lessonData.day, lessonType: lessonData.type, didacticMode: pedagogy.didacticMode, phaseLabel: pedagogy.phaseLabel, blockNumber: pedagogy.blockNumber, difficultyWeight: pedagogy.difficultyWeight, newUnitTarget: pedagogy.newUnitTarget, reviewWeight: pedagogy.reviewWeight, isIntensiveReview: pedagogy.isIntensiveReview, culturalNotes: lessonData.cultural, learningGoals: didactics.learningGoals || null, corePatterns: didactics.corePatterns || null, grammarFocus: didactics.grammarFocus || null, speakingPrompts: didactics.speakingPrompts || null, practicalTasks: didactics.practicalTasks || null, targetMinutes: progressTargets.targetMinutes, targetScorePercent: progressTargets.targetScorePercent, requiresReview: lessonData.review }); } course.title = 'Deutsch für Bisaya-Lernende - Alltagspfad'; course.description = '12 Wochen Deutsch-Lernpfad aus Sicht von Bisaya-Lernenden mit Schnellstart, Alltag und gezieltem Fehlertraining.'; await course.save(); console.log(`Phase 4 erweitert: ${course.title} (ID: ${course.id})`); } } if (import.meta.url === `file://${process.argv[1]}`) { extendGermanForBisayaPhase4() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); }