Files
kalendartool/prisma/seed-admin.cjs

78 lines
2.5 KiB
JavaScript

/**
* 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) {
console.error(
'[seed] Verwendung: node prisma/seed-admin.cjs <email> <passwort>\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();
});