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 = [ { name: 'Ahrens Frank', address: 'Alte Poststraße 15, 29303 Bergen', phone: '01724525953', landline: null, type: 'HS', gps: { lat: 52.8090, lng: 9.9640 } }, { name: 'Becker Michael', address: 'Amselweg 17, 21255 Tostedt', phone: '01711470404', landline: null, type: 'HS', gps: { lat: 53.2808, lng: 9.7142 } }, { name: 'Dahlem Frank', address: 'Neues Land 17, 29649 Wietzendorf', phone: '017647143321', landline: '051963849802', type: 'HS', gps: { lat: 52.9469, lng: 9.8906 } }, { name: 'Eggers Petra', address: 'Giltener Weg 48, 27336 Frankenfeld', phone: '01724201762', landline: null, type: 'SB', gps: { lat: 52.6826, lng: 9.4467 } }, { name: 'Fuhrwerk Gundolf', address: 'Am Oerbker Bach 2, 29683 Oerbke', phone: '01703400633', landline: '051623563', type: 'BGS', gps: { lat: 52.7461, lng: 9.6614 } }, { name: 'Heinrich Helmut', address: 'Memeler Straße 1, 30938 Burgwedel', phone: '01725130814', landline: '05135651', type: 'HS', gps: { lat: 52.4949, lng: 9.9104 } }, { name: 'Hilgers Timo', address: 'Brock 6a, 29683 Bad Fallingbostel-Dorfmark', phone: '015127515764', landline: null, type: 'BGS', gps: { lat: 52.8847, lng: 9.7256 } }, { name: 'Lünebach-Hüner Andrea', address: 'Idsingen 5, 29664 Walsrode', phone: '015231601800', landline: null, type: 'LAB', gps: { lat: 52.8833, lng: 9.5880 } }, { name: 'Neumann Axel', address: 'Papendoren 24, 21409 Embsen', phone: '01704051834', landline: null, type: 'HS', gps: { lat: 53.2237, lng: 10.3509 } }, { name: 'Peschek Hjalmar', address: 'Gaswerkstraße 8, 27374 Visselhövede', phone: '01708561360', landline: null, type: 'BGS', gps: { lat: 52.9836, lng: 9.5819 } }, { name: 'Seegräber Markus', address: 'Wiedenburgstraße 19, 27336 Rethem', phone: '01621340448', landline: null, type: 'BGS', gps: { lat: 52.7836, lng: 9.3775 } }, { name: 'Sudhoff Andreas', address: 'Lotharstraße 46, 29320 Hermannsburg', phone: '01704607351', landline: null, type: 'HS', gps: { lat: 52.8220, lng: 10.1094 } }, { name: 'Wichmann Jens-Peter', address: 'Im Dorf 8, 21256 Handeloh', phone: '01712705744', landline: '04187531', type: 'HS', gps: { lat: 53.2700, lng: 9.7833 } } ]; const seedDatabase = async () => { try { await mongoose.connect(config.mongoUri, { useNewUrlParser: true, useUnifiedTopology: true }); 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} Nachsuchenführer wurden erstellt`); } else { logger.info(`ℹ️ Benutzer bereits vorhanden (${existingUserCount}), überspringe Seeding`); } // Seed admins (only if not exists) const adminAccounts = [ { 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: 'HS', label: 'Hannoverscher Schweißhund' }, { code: 'BGS', label: 'Bayerischer Gebirgsschweißhund' }, { code: 'SB', label: 'Schweißhund (allgemein)' }, { code: 'LAB', label: 'Labrador' } ], rules: [ "Verbreiten Sie den Standort und den Anschuss.", "Vertreten Sie keine Pirschzeichen.", "Versuchen Sie die Nachsuche möglichst nicht erst mit ungeübten Hunden.", "Benachrichtigen Sie unverzüglich den Nachsuchenführer und die evtl. betroffenen Revierinhaber der Nachbarjagdbezirke.", "Der Hundeführer gibt den Fangschuss auf das gestellte Stück ab.", "Bei der Nachsuche hat der Hundeführer die Stellung eines Jagdleiters.", "Der anfordernde Revierinhaber muss die betroffenen Nachbarreviere verständigen.", "Auf Empfehlung der Jägerschaften Soltau und Fallingbostel ist bei Inanspruchnahme eine pauschale Aufwandsentschädigung an den Nachsuchenführer von 50,00 € zu entrichten." ], appName: 'Nachsuchenstation Heidekreis', sections: [ { key: 'ueber-uns', title: 'Die Nachsuchenstation 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 und Koordination der Nachsuchenstation Heidekreis\n\nMarc Sonnemann\nHamwiede 5 b\n29664 Walsrode\n\nTel. 01725170049 / 051684802922\nMail: nachsuchenstation-hk@jaegerschaft-fallingbostel.de' } ], 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();