110 lines
3.6 KiB
JavaScript
110 lines
3.6 KiB
JavaScript
// scripts/create-user.js
|
||
const { Pool } = require('pg');
|
||
const bcrypt = require('bcrypt');
|
||
const readline = require('readline');
|
||
require('dotenv').config();
|
||
|
||
const pool = new Pool({
|
||
host: process.env.DB_HOST,
|
||
port: process.env.DB_PORT,
|
||
database: process.env.DB_NAME,
|
||
user: process.env.DB_USER,
|
||
password: process.env.DB_PASSWORD,
|
||
ssl: process.env.DB_SSL === 'true' ? { rejectUnauthorized: false } : false
|
||
});
|
||
|
||
// Readline Interface für Benutzereingaben
|
||
const rl = readline.createInterface({
|
||
input: process.stdin,
|
||
output: process.stdout
|
||
});
|
||
|
||
// Hilfsfunktion für Benutzereingaben
|
||
function askQuestion(question) {
|
||
return new Promise((resolve) => {
|
||
rl.question(question, (answer) => {
|
||
resolve(answer.trim());
|
||
});
|
||
});
|
||
}
|
||
|
||
async function createUser() {
|
||
try {
|
||
console.log('👤 Erstelle neuen Benutzer...\n');
|
||
|
||
// Verbindung testen
|
||
await pool.query('SELECT NOW()');
|
||
console.log('✅ Datenbankverbindung erfolgreich\n');
|
||
|
||
// Benutzereingaben abfragen
|
||
const username = await askQuestion('Benutzername eingeben: ');
|
||
if (!username) {
|
||
console.log('❌ Benutzername darf nicht leer sein!');
|
||
return;
|
||
}
|
||
|
||
const password = await askQuestion('Passwort eingeben: ');
|
||
if (!password) {
|
||
console.log('❌ Passwort darf nicht leer sein!');
|
||
return;
|
||
}
|
||
|
||
const confirmPassword = await askQuestion('Passwort bestätigen: ');
|
||
if (password !== confirmPassword) {
|
||
console.log('❌ Passwörter stimmen nicht überein!');
|
||
return;
|
||
}
|
||
|
||
console.log('\n🔄 Erstelle Benutzer...');
|
||
|
||
// Prüfen ob Benutzer bereits existiert
|
||
const existingUser = await pool.query(
|
||
'SELECT id FROM adminusers WHERE username = $1',
|
||
[username]
|
||
);
|
||
|
||
if (existingUser.rows.length > 0) {
|
||
console.log(`ℹ️ Benutzer "${username}" existiert bereits`);
|
||
|
||
const update = await askQuestion('Passwort aktualisieren? (j/n): ');
|
||
if (update.toLowerCase() === 'j' || update.toLowerCase() === 'ja' || update.toLowerCase() === 'y' || update.toLowerCase() === 'yes') {
|
||
const passwordHash = await bcrypt.hash(password, 10);
|
||
await pool.query(
|
||
'UPDATE adminusers SET password_hash = $1 WHERE username = $2',
|
||
[passwordHash, username]
|
||
);
|
||
console.log(`✅ Passwort für Benutzer "${username}" aktualisiert`);
|
||
} else {
|
||
console.log('❌ Vorgang abgebrochen');
|
||
return;
|
||
}
|
||
} else {
|
||
// Neuen Benutzer erstellen
|
||
const passwordHash = await bcrypt.hash(password, 10);
|
||
await pool.query(
|
||
'INSERT INTO adminusers (username, password_hash) VALUES ($1, $2)',
|
||
[username, passwordHash]
|
||
);
|
||
console.log(`✅ Benutzer "${username}" erfolgreich erstellt`);
|
||
}
|
||
|
||
console.log('\n📝 Anmeldedaten:');
|
||
console.log(` Benutzername: ${username}`);
|
||
console.log(` Passwort: ${password}`);
|
||
|
||
} catch (error) {
|
||
console.error('❌ Fehler beim Erstellen des Benutzers:', error);
|
||
process.exit(1);
|
||
} finally {
|
||
rl.close();
|
||
await pool.end();
|
||
}
|
||
}
|
||
|
||
// Skript ausführen wenn direkt aufgerufen
|
||
if (require.main === module) {
|
||
createUser();
|
||
}
|
||
|
||
module.exports = { createUser };
|