108 lines
3.8 KiB
JavaScript
108 lines
3.8 KiB
JavaScript
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 {
|
||
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
|
||
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 {
|
||
await Config.findOneAndUpdate({}, configData, { new: true });
|
||
logger.info('✅ Konfiguration aktualisiert');
|
||
}
|
||
|
||
logger.info('✅ Datenbank-Seeding abgeschlossen');
|
||
await mongoose.connection.close();
|
||
process.exit(0);
|
||
} catch (error) {
|
||
logger.error('❌ Fehler beim Seeding:', error);
|
||
await mongoose.connection.close();
|
||
process.exit(1);
|
||
}
|
||
};
|
||
|
||
seedDatabase();
|