/** * Seed-Script: Legt einen Admin-Account an (First-Run-Setup). * * Wird beim Container-Start ausgefuehrt (nach migrate deploy, vor server.js) * und kann auch manuell aufgerufen werden: * * docker compose exec app node prisma/seed-admin.cjs admin@example.com "Passwort10" * * Verhalten (nicht-destruktiv, wie bei Gitea/Vaultwarden): * - Wenn bereits ein Admin existiert: Abbruch mit Hinweis (nichts geloescht). * - Wenn noch kein Admin existiert: Legt genau einen an. * - Bestehende User werden NIEMALS geloescht. * - Wenn SEED_ADMIN_* nicht gesetzt sind: laeuft ohne Nebeneffekte durch. * * Credentials werden aus Env-Variablen oder CLI-Argumenten gelesen * (CLI-Argumente haben Vorrang). */ const { PrismaClient } = require('@prisma/client'); const bcrypt = require('bcryptjs'); const prisma = new PrismaClient(); async function seedAdmin() { // CLI-Argumente haben Vorrang vor Env-Variablen. const email = (process.argv[2] || process.env.SEED_ADMIN_EMAIL || '').trim(); const password = (process.argv[3] || process.env.SEED_ADMIN_PASSWORD || '').trim(); if (!email || !password) { if (!email && !password) { console.log('[seed] Keine Admin-Startdaten konfiguriert; überspringe Seed.'); return; } console.error( '[seed] Verwendung: node prisma/seed-admin.cjs \n' + ' oder: SEED_ADMIN_EMAIL=… SEED_ADMIN_PASSWORD=… node prisma/seed-admin.cjs', ); process.exitCode = 1; return; } if (password.length < 10) { console.error('[seed] Passwort muss mindestens 10 Zeichen lang sein.'); process.exitCode = 1; return; } // First-Run-Detection: Wenn schon ein Admin existiert, nicht anlegen. const adminCount = await prisma.user.count({ where: { role: 'ADMIN' } }); if (adminCount > 0) { console.log('[seed] Es existiert bereits ein Admin-Account. Abbruch (nicht-destruktiv).'); return; } // Pruefen, ob die E-Mail bereits von einem normalen User belegt ist. const existing = await prisma.user.findUnique({ where: { email: email } }); if (existing) { console.error('[seed] Ein User mit dieser E-Mail existiert bereits (als USER).'); process.exitCode = 1; return; } const passwordHash = await bcrypt.hash(password, 12); await prisma.user.create({ data: { email: email, passwordHash: passwordHash, role: 'ADMIN', }, }); console.log('[seed] Admin-Account "' + email + '" erfolgreich angelegt.'); } seedAdmin() .catch(function (error) { console.error('[seed] Fehler:', error); process.exitCode = 1; }) .finally(async function () { await prisma.$disconnect(); });