feat: Füge Skript hinzu, um problematische Multiple-Choice-Übungen zu identifizieren und zu löschen
All checks were successful
Deploy to production / deploy (push) Successful in 1m57s

This commit is contained in:
Torsten Schulz (local)
2026-05-21 13:47:42 +02:00
parent 38ebeb084d
commit 74b7297c97

View File

@@ -0,0 +1,74 @@
#!/usr/bin/env node
/**
* Findet Multiple-Choice-Übungen, bei denen die Frage ein einzelnes Wort ist
* aber die richtige Antwort ein kompletter Satz (mehrere Wörter) ist.
*
* Default: Dry-run und listet die gefundenen Übungen auf.
* Use --apply to actually delete them from the DB.
*/
import { sequelize } from '../utils/sequelize.js';
import VocabGrammarExercise from '../models/community/vocab_grammar_exercise.js';
const args = process.argv.slice(2);
const apply = args.includes('--apply');
async function run() {
try {
await sequelize.authenticate();
console.log('✅ DB verbunden');
const list = await VocabGrammarExercise.findAll({
where: { exerciseTypeId: 2 },
order: [['lesson_id', 'ASC'], ['exercise_number', 'ASC']]
});
const candidates = [];
for (const ex of list) {
const q = ex.questionData || {};
const a = ex.answerData || {};
const questionText = String(q.question || q.text || '').trim();
const correct = String(a.correctAnswer || a.correct || a.correctAnswerText || '').trim();
if (!questionText || !correct) continue;
const questionWords = questionText.split(/\s+/).filter(Boolean).length;
const correctWords = correct.split(/\s+/).filter(Boolean).length;
// Heuristik: Frage ist Einzelwort, Antwort ist Satz (>1 Wort)
if (questionWords === 1 && correctWords > 1) {
candidates.push({ id: ex.id, lessonId: ex.lessonId, exerciseNumber: ex.exerciseNumber, title: ex.title, questionText, correct });
}
}
if (!candidates.length) {
console.log('Keine problematischen MC-Übungen gefunden.');
return;
}
console.log(`Gefundene problematische Übungen: ${candidates.length}`);
candidates.forEach((c, i) => {
console.log(`${i + 1}. ID:${c.id} lesson:${c.lessonId} #${c.exerciseNumber} title:"${c.title}" question:"${c.questionText}" -> correct:"${c.correct}"`);
});
if (!apply) {
console.log('\nDry-run beendet. Verwende --apply, um die gefundenen Übungen zu löschen.');
return;
}
console.log('\n--apply gesetzt: Lösche die gefundenen Übungen...');
for (const c of candidates) {
const ex = await VocabGrammarExercise.findByPk(c.id);
if (ex) {
await ex.destroy();
console.log(`Gelöscht: ID ${c.id}`);
}
}
console.log('Fertig.');
} catch (err) {
console.error('Fehler:', err);
} finally {
await sequelize.close();
}
}
run();