83 lines
2.6 KiB
JavaScript
83 lines
2.6 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) {
|
|
if (!email && !password) {
|
|
console.log('[seed] Keine Admin-Startdaten konfiguriert; überspringe Seed.');
|
|
return;
|
|
}
|
|
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();
|
|
});
|