const mongoose = require('mongoose'); const User = require('./models/User'); const Admin = require('./models/Admin'); const Config = require('./models/Config'); const config = require('./config/env'); const logger = require('./utils/logger'); const users = []; const seedDatabase = async () => { try { // Beim Aufruf aus server.js besteht die Verbindung bereits. if (mongoose.connection.readyState !== 1) { await mongoose.connect(config.mongoUri); } logger.info('MongoDB verbunden für Seeding...'); // Seed users - only if collection is empty (idempotent) const existingUserCount = await User.countDocuments(); if (existingUserCount === 0) { await User.insertMany(users); logger.info(`✅ ${users.length} Drohnenführer wurden erstellt`); } else { logger.info(`ℹ️ Benutzer bereits vorhanden (${existingUserCount}), überspringe Seeding`); } // Seed admins (only if not exists) const adminAccounts = [ { username: 'admin', passwordEnvVar: 'ADMIN_PASSWORD', defaultPassword: process.env.ADMIN_PASSWORD || null }, { username: 'ThorstenMeyer', passwordEnvVar: 'ADMIN_THORSTEN_PASSWORD', defaultPassword: process.env.ADMIN_THORSTEN_PASSWORD || null } ]; let adminId; for (const account of adminAccounts) { const existing = await Admin.findOne({ username: account.username }); if (!existing) { const pw = process.env[account.passwordEnvVar] || account.defaultPassword; if (!pw) { logger.warn(`⚠️ Kein Passwort für ${account.username} konfiguriert, überspringe`); continue; } const created = await Admin.create({ username: account.username, password: pw }); adminId = created._id; logger.info(`✅ Admin-Benutzer erstellt: ${account.username}`); } else { adminId = existing._id; logger.info(`ℹ️ Admin-Benutzer existiert bereits: ${account.username}`); } } if (!adminId) { const fallback = await Admin.findOne(); adminId = fallback?._id; } // Seed config - always update userTypes + sections + rules // Config NUR anlegen, niemals ueberschreiben. Vorher hat jeder Neustart // die im Admin-Panel gepflegten Texte, Regeln und den App-Namen zurueckgesetzt. const existingConfig = await Config.findOne(); const configData = { userTypes: [ { code: 'DF', label: 'Drohnenführer' }, { code: 'WK', label: 'Wärmebildkamera' }, { code: 'RGB', label: 'RGB-Kamera' } ], rules: [ "Drohnenflug nur mit gültigem Drohnenführerschein (A1/A3 oder A2).", "Informieren Sie den zuständigen Revierinhaber vor jedem Einsatz.", "Halten Sie die Datenschutzbestimmungen beim Einsatz von Wärmebildkameras ein.", "Geben Sie keine Aufnahmen ohne Zustimmung des Revierinhabers weiter.", "Melden Sie Ihren Einsatz unverzüglich an die koordinierende Stelle." ], appName: 'Drohnenführer Heidekreis', sections: [ { key: 'ueber-uns', title: 'Die Drohnenführer Heidekreis', content: '[Inhalt folgt – wird durch den Admin ergänzt]' }, { key: 'anwendung', title: 'Anwendung der App', content: '[Erklärung für den Anwender folgt – wird durch den Admin ergänzt]' }, { key: 'ansprechpartner', title: 'Ansprechpartner und Koordination', content: '[Ansprechpartner folgt – wird durch den Admin ergänzt]' } ], updatedBy: adminId }; if (!existingConfig) { await Config.create(configData); logger.info('✅ Konfiguration erstellt'); } else { logger.info('ℹ️ Konfiguration existiert bereits, bleibt unveraendert'); } logger.info('✅ Datenbank-Seeding abgeschlossen'); } catch (error) { logger.error('❌ Fehler beim Seeding:', error); throw error; } }; // Verbindung schliessen und den Prozess beenden darf nur der CLI-Aufruf // (npm run seed). server.js ruft seedDatabase() im selben Prozess auf – ein // process.exit(0) hier hat den frisch gestarteten Server sofort wieder beendet. if (require.main === module) { seedDatabase() .then(async () => { await mongoose.connection.close(); process.exit(0); }) .catch(async () => { await mongoose.connection.close(); process.exit(1); }); } module.exports = seedDatabase;