Initial commit: Kalendartool (Next.js, Prisma, Docker)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
78
prisma/seed-admin.cjs
Normal file
78
prisma/seed-admin.cjs
Normal file
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* 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();
|
||||
});
|
||||
Reference in New Issue
Block a user