#!/usr/bin/env node /** * Script zur automatischen Korrektur aller Index-Felder * Konvertiert camelCase zu snake_case für underscored: true Models */ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Funktion zur Konvertierung von camelCase zu snake_case function camelToSnakeCase(str) { return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`); } // Funktion zur Korrektur einer Model-Datei function fixModelFile(filePath) { try { let content = fs.readFileSync(filePath, 'utf8'); let modified = false; // Suche nach Index-Definitionen - verbesserte Regex const indexRegex = /indexes:\s*\[([\s\S]*?)\]/g; let match; while ((match = indexRegex.exec(content)) !== null) { const indexesSection = match[1]; // Suche nach fields-Arrays - verbesserte Regex const fieldsRegex = /fields:\s*\[([^\]]+)\]/g; let fieldsMatch; while ((fieldsMatch = fieldsRegex.exec(indexesSection)) !== null) { const fieldsString = fieldsMatch[1]; // Verbesserte Feld-Extraktion const fields = fieldsString.split(',').map(f => { const cleaned = f.trim().replace(/['"]/g, ''); return cleaned; }).filter(f => f.length > 0); // Konvertiere jedes Feld von camelCase zu snake_case const correctedFields = fields.map(field => { if (field.includes('_')) { return field; // Bereits snake_case } const corrected = camelToSnakeCase(field); if (corrected !== field) { console.log(` 🔄 ${field} → ${corrected}`); modified = true; } return corrected; }); // Ersetze die fields-Array - verbesserte Ersetzung const oldFieldsString = `fields: [${fields.map(f => `'${f}'`).join(', ')}]`; const newFieldsString = `fields: [${correctedFields.map(f => `'${f}'`).join(', ')}]`; // Debug-Ausgabe console.log(` 📍 Datei: ${path.basename(filePath)}`); console.log(` 🔍 Gefunden: ${oldFieldsString}`); console.log(` ✅ Ersetzt: ${newFieldsString}`); content = content.replace(oldFieldsString, newFieldsString); } } if (modified) { fs.writeFileSync(filePath, content, 'utf8'); console.log(`✅ ${filePath} korrigiert`); } return modified; } catch (error) { console.error(`❌ Fehler bei ${filePath}:`, error.message); return false; } } // Hauptfunktion async function main() { console.log('🔧 Starte automatische Korrektur aller Index-Felder...'); const modelsDir = path.join(__dirname, 'models'); let totalFiles = 0; let modifiedFiles = 0; // Rekursiv alle .js-Dateien im models-Verzeichnis durchsuchen function processDirectory(dir) { const items = fs.readdirSync(dir); for (const item of items) { const fullPath = path.join(dir, item); const stat = fs.statSync(fullPath); if (stat.isDirectory()) { processDirectory(fullPath); } else if (item.endsWith('.js')) { totalFiles++; if (fixModelFile(fullPath)) { modifiedFiles++; } } } } processDirectory(modelsDir); console.log('\n🎉 Korrektur abgeschlossen!'); console.log(`📊 Gesamt: ${totalFiles} Dateien geprüft`); console.log(`✅ Geändert: ${modifiedFiles} Dateien`); if (modifiedFiles > 0) { console.log('\n💡 Führen Sie jetzt das Deployment erneut aus:'); console.log(' sudo ./deploy-backend.sh'); } } main().catch(console.error);