#!/usr/bin/env node /** * Script zum Erstellen eines vollständigen 4-Wochen Bisaya-Kurses * * Verwendung: * node backend/scripts/create-bisaya-course.js */ import { sequelize } from '../utils/sequelize.js'; import VocabCourse from '../models/community/vocab_course.js'; import VocabCourseLesson from '../models/community/vocab_course_lesson.js'; import User from '../models/community/user.js'; import crypto from 'crypto'; const LESSONS = [ // WOCHE 1: Grundlagen & Aussprache { week: 1, day: 1, num: 1, type: 'conversation', title: 'Begrüßungen & Höflichkeit', desc: 'Lerne die wichtigsten Begrüßungen und Höflichkeitsformeln', targetMin: 15, targetScore: 80, review: false, cultural: 'Philippiner schätzen Höflichkeit sehr. Lächeln ist wichtig!' }, { week: 1, day: 1, num: 2, type: 'vocab', title: 'Überlebenssätze - Teil 1', desc: 'Die 10 wichtigsten Sätze für den Alltag', targetMin: 20, targetScore: 85, review: true, cultural: 'Diese Sätze helfen dir sofort im Alltag weiter.' }, { week: 1, day: 2, num: 3, type: 'vocab', title: 'Familienwörter', desc: 'Mama, Papa, Kuya, Ate, Lola, Lolo und mehr', targetMin: 20, targetScore: 85, review: true, cultural: 'Kuya und Ate werden auch für Nicht-Verwandte verwendet – sehr respektvoll!' }, { week: 1, day: 2, num: 4, type: 'conversation', title: 'Familien-Gespräche', desc: 'Einfache Gespräche mit Familienmitgliedern', targetMin: 15, targetScore: 80, review: false, cultural: 'Familienkonversationen sind herzlicher als formelle Gespräche.' }, { week: 1, day: 3, num: 5, type: 'conversation', title: 'Gefühle & Zuneigung', desc: 'Mingaw ko nimo, Palangga taka und mehr', targetMin: 15, targetScore: 80, review: false, cultural: 'Palangga taka ist wärmer als "I love you" im Familienkontext.' }, { week: 1, day: 3, num: 6, type: 'vocab', title: 'Überlebenssätze - Teil 2', desc: 'Weitere wichtige Alltagssätze', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 1, day: 4, num: 7, type: 'conversation', title: 'Essen & Fürsorge', desc: 'Nikaon ka? Kaon ta! Lami!', targetMin: 15, targetScore: 80, review: false, cultural: 'Essen = Liebe! "Nikaon na ka?" ist sehr fürsorglich.' }, { week: 1, day: 4, num: 8, type: 'vocab', title: 'Essen & Trinken', desc: 'Wichtige Wörter rund ums Essen', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 1, day: 5, num: 9, type: 'review', title: 'Woche 1 - Wiederholung', desc: 'Wiederhole alle Inhalte der ersten Woche', targetMin: 30, targetScore: 80, review: false, cultural: 'Wiederholung ist der Schlüssel zum Erfolg!' }, { week: 1, day: 5, num: 10, type: 'vocab', title: 'Woche 1 - Vokabeltest', desc: 'Teste dein Wissen aus Woche 1', targetMin: 15, targetScore: 80, review: true, cultural: null }, // WOCHE 2: Alltag & Familie { week: 2, day: 1, num: 11, type: 'conversation', title: 'Alltagsgespräche - Teil 1', desc: 'Wie war dein Tag? Was machst du?', targetMin: 15, targetScore: 80, review: false, cultural: 'Alltagsgespräche sind wichtig für echte Kommunikation.' }, { week: 2, day: 1, num: 12, type: 'vocab', title: 'Haus & Familie', desc: 'Balay, Kwarto, Kusina, Pamilya', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 2, day: 2, num: 13, type: 'conversation', title: 'Alltagsgespräche - Teil 2', desc: 'Wohin gehst du? Was machst du heute?', targetMin: 15, targetScore: 80, review: false, cultural: null }, { week: 2, day: 2, num: 14, type: 'vocab', title: 'Ort & Richtung', desc: 'Asa, dinhi, didto, padulong', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 2, day: 3, num: 15, type: 'grammar', title: 'Zeitformen - Grundlagen', desc: 'Ni-kaon ko, Mo-kaon ko - Vergangenheit und Zukunft', targetMin: 25, targetScore: 75, review: true, cultural: 'Cebuano hat keine komplexen Zeiten wie Deutsch. Zeit wird mit Präfixen ausgedrückt.' }, { week: 2, day: 3, num: 16, type: 'vocab', title: 'Zeit & Datum', desc: 'Karon, ugma, gahapon, karon adlaw', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 2, day: 4, num: 17, type: 'conversation', title: 'Einkaufen & Preise', desc: 'Tagpila ni? Pwede barato?', targetMin: 15, targetScore: 80, review: false, cultural: 'Handeln ist in den Philippinen üblich und erwartet.' }, { week: 2, day: 4, num: 18, type: 'vocab', title: 'Zahlen & Preise', desc: '1-100, Preise, Mengen', targetMin: 25, targetScore: 85, review: true, cultural: null }, { week: 2, day: 5, num: 19, type: 'review', title: 'Woche 2 - Wiederholung', desc: 'Wiederhole alle Inhalte der zweiten Woche', targetMin: 30, targetScore: 80, review: false, cultural: null }, { week: 2, day: 5, num: 20, type: 'vocab', title: 'Woche 2 - Vokabeltest', desc: 'Teste dein Wissen aus Woche 2', targetMin: 15, targetScore: 80, review: true, cultural: null }, // WOCHE 3: Vertiefung { week: 3, day: 1, num: 21, type: 'conversation', title: 'Gefühle & Emotionen', desc: 'Nalipay, nasubo, nahadlok, naguol', targetMin: 15, targetScore: 80, review: false, cultural: 'Emotionen auszudrücken ist wichtig für echte Verbindung.' }, { week: 3, day: 1, num: 22, type: 'vocab', title: 'Gefühle & Emotionen', desc: 'Wörter für verschiedene Gefühle', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 3, day: 2, num: 23, type: 'conversation', title: 'Gesundheit & Wohlbefinden', desc: 'Sakit, maayo, tambal, doktor', targetMin: 15, targetScore: 80, review: false, cultural: null }, { week: 3, day: 2, num: 24, type: 'vocab', title: 'Körper & Gesundheit', desc: 'Wörter rund um den Körper und Gesundheit', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 3, day: 3, num: 25, type: 'grammar', title: 'Höflichkeitsformen', desc: 'Palihug, Pwede, Tabang', targetMin: 20, targetScore: 75, review: true, cultural: 'Höflichkeit ist extrem wichtig in der philippinischen Kultur.' }, { week: 3, day: 3, num: 26, type: 'conversation', title: 'Bitten & Fragen', desc: 'Wie man höflich fragt und bittet', targetMin: 15, targetScore: 80, review: false, cultural: null }, { week: 3, day: 4, num: 27, type: 'conversation', title: 'Kinder & Familie', desc: 'Gespräche mit und über Kinder', targetMin: 15, targetScore: 80, review: false, cultural: 'Kinder sind sehr wichtig in philippinischen Familien.' }, { week: 3, day: 4, num: 28, type: 'vocab', title: 'Kinder & Spiel', desc: 'Wörter für Kinder und Spielsachen', targetMin: 20, targetScore: 85, review: true, cultural: null }, { week: 3, day: 5, num: 29, type: 'review', title: 'Woche 3 - Wiederholung', desc: 'Wiederhole alle Inhalte der dritten Woche', targetMin: 30, targetScore: 80, review: false, cultural: null }, { week: 3, day: 5, num: 30, type: 'vocab', title: 'Woche 3 - Vokabeltest', desc: 'Teste dein Wissen aus Woche 3', targetMin: 15, targetScore: 80, review: true, cultural: null }, // WOCHE 4: Freies Sprechen { week: 4, day: 1, num: 31, type: 'conversation', title: 'Freies Gespräch - Thema 1', desc: 'Übe freies Sprechen zu verschiedenen Themen', targetMin: 20, targetScore: 75, review: false, cultural: 'Fehler sind okay! Philippiner schätzen das Bemühen.' }, { week: 4, day: 1, num: 32, type: 'vocab', title: 'Wiederholung - Woche 1 & 2', desc: 'Wiederhole wichtige Vokabeln aus den ersten beiden Wochen', targetMin: 25, targetScore: 85, review: true, cultural: null }, { week: 4, day: 2, num: 33, type: 'conversation', title: 'Freies Gespräch - Thema 2', desc: 'Weitere Übung im freien Sprechen', targetMin: 20, targetScore: 75, review: false, cultural: null }, { week: 4, day: 2, num: 34, type: 'vocab', title: 'Wiederholung - Woche 3', desc: 'Wiederhole wichtige Vokabeln aus Woche 3', targetMin: 25, targetScore: 85, review: true, cultural: null }, { week: 4, day: 3, num: 35, type: 'conversation', title: 'Komplexere Gespräche', desc: 'Längere Gespräche zu verschiedenen Themen', targetMin: 25, targetScore: 75, review: false, cultural: 'Je mehr du sprichst, desto besser wirst du!' }, { week: 4, day: 3, num: 36, type: 'review', title: 'Gesamtwiederholung', desc: 'Wiederhole alle wichtigen Inhalte des Kurses', targetMin: 30, targetScore: 80, review: false, cultural: null }, { week: 4, day: 4, num: 37, type: 'conversation', title: 'Praktische Übung', desc: 'Simuliere echte Gesprächssituationen', targetMin: 25, targetScore: 75, review: false, cultural: null }, { week: 4, day: 4, num: 38, type: 'vocab', title: 'Abschlusstest - Vokabeln', desc: 'Finaler Vokabeltest über den gesamten Kurs', targetMin: 20, targetScore: 80, review: true, cultural: null }, { week: 4, day: 5, num: 39, type: 'review', title: 'Abschlussprüfung', desc: 'Finale Prüfung über alle Kursinhalte', targetMin: 30, targetScore: 80, review: false, cultural: 'Gratulation zum Abschluss des Kurses!' }, { week: 4, day: 5, num: 40, type: 'culture', title: 'Kulturelle Tipps & Tricks', desc: 'Wichtige kulturelle Hinweise für den Alltag', targetMin: 15, targetScore: 0, review: false, cultural: 'Kulturelles Verständnis ist genauso wichtig wie die Sprache selbst.' } ]; async function createBisayaCourse(languageId, ownerHashedId) { try { // Finde User const user = await User.findOne({ where: { hashedId: ownerHashedId } }); if (!user) { throw new Error(`User mit hashedId ${ownerHashedId} nicht gefunden`); } // Prüfe, ob Sprache existiert const [lang] = await sequelize.query( `SELECT id FROM community.vocab_language WHERE id = :langId`, { replacements: { langId: languageId }, type: sequelize.QueryTypes.SELECT } ); if (!lang) { throw new Error(`Sprache mit ID ${languageId} nicht gefunden`); } // Erstelle Kurs const shareCode = crypto.randomBytes(8).toString('hex'); const course = await VocabCourse.create({ ownerUserId: user.id, title: 'Bisaya für Familien - Schnellstart in 4 Wochen', description: 'Lerne Bisaya (Cebuano) schnell und praktisch für den Familienalltag. Fokus auf Sprechen & Hören mit strukturiertem 4-Wochen-Plan.', languageId: Number(languageId), difficultyLevel: 1, isPublic: true, shareCode }); console.log(`✅ Kurs erstellt: ${course.id} - "${course.title}"`); console.log(` Share-Code: ${shareCode}`); // Erstelle Lektionen for (const lessonData of LESSONS) { const lesson = await VocabCourseLesson.create({ courseId: course.id, chapterId: null, // Wird später mit Vokabeln verknüpft lessonNumber: lessonData.num, title: lessonData.title, description: lessonData.desc, weekNumber: lessonData.week, dayNumber: lessonData.day, lessonType: lessonData.type, culturalNotes: lessonData.cultural, targetMinutes: lessonData.targetMin, targetScorePercent: lessonData.targetScore, requiresReview: lessonData.review }); console.log(` ✅ Lektion ${lessonData.num}: ${lessonData.title} (Woche ${lessonData.week}, Tag ${lessonData.day})`); } console.log(`\n🎉 Kurs erfolgreich erstellt mit ${LESSONS.length} Lektionen!`); console.log(`\n📊 Kurs-Statistik:`); console.log(` - Gesamte Lektionen: ${LESSONS.length}`); console.log(` - Vokabel-Lektionen: ${LESSONS.filter(l => l.type === 'vocab').length}`); console.log(` - Konversations-Lektionen: ${LESSONS.filter(l => l.type === 'conversation').length}`); console.log(` - Grammatik-Lektionen: ${LESSONS.filter(l => l.type === 'grammar').length}`); console.log(` - Wiederholungs-Lektionen: ${LESSONS.filter(l => l.type === 'review').length}`); console.log(` - Durchschnittliche Zeit pro Tag: ~${Math.round(LESSONS.reduce((sum, l) => sum + l.targetMin, 0) / (4 * 5))} Minuten`); console.log(`\n💡 Nächste Schritte:`); console.log(` 1. Füge Vokabeln zu den Vokabel-Lektionen hinzu`); console.log(` 2. Erstelle Grammatik-Übungen für die Grammatik-Lektionen`); console.log(` 3. Teile den Kurs mit anderen (Share-Code: ${shareCode})`); return course; } catch (error) { console.error('❌ Fehler beim Erstellen des Kurses:', error); throw error; } } // CLI-Aufruf const languageId = process.argv[2]; const ownerHashedId = process.argv[3]; if (!languageId || !ownerHashedId) { console.error('Verwendung: node create-bisaya-course.js '); console.error('Beispiel: node create-bisaya-course.js 1 abc123def456'); process.exit(1); } createBisayaCourse(languageId, ownerHashedId) .then(() => { process.exit(0); }) .catch((error) => { console.error(error); process.exit(1); });