Refactoring
This commit is contained in:
154
routes/admin.js
Normal file
154
routes/admin.js
Normal file
@@ -0,0 +1,154 @@
|
||||
// Admin Routes
|
||||
|
||||
const bcrypt = require('bcryptjs');
|
||||
const { db } = require('../database');
|
||||
const { requireAdmin } = require('../middleware/auth');
|
||||
|
||||
// Routes registrieren
|
||||
function registerAdminRoutes(app) {
|
||||
// Admin-Bereich
|
||||
app.get('/admin', requireAdmin, (req, res) => {
|
||||
db.all('SELECT id, username, firstname, lastname, role, personalnummer, wochenstunden, urlaubstage, created_at FROM users ORDER BY created_at DESC',
|
||||
(err, users) => {
|
||||
// LDAP-Konfiguration und Sync-Log abrufen
|
||||
db.get('SELECT * FROM ldap_config WHERE id = 1', (err, ldapConfig) => {
|
||||
db.all('SELECT * FROM ldap_sync_log ORDER BY sync_started_at DESC LIMIT 10', (err, syncLogs) => {
|
||||
// Parse Rollen für jeden User
|
||||
const usersWithRoles = (users || []).map(u => {
|
||||
let roles = [];
|
||||
try {
|
||||
roles = JSON.parse(u.role);
|
||||
if (!Array.isArray(roles)) {
|
||||
roles = [u.role];
|
||||
}
|
||||
} catch (e) {
|
||||
roles = [u.role || 'mitarbeiter'];
|
||||
}
|
||||
return { ...u, roles };
|
||||
});
|
||||
|
||||
res.render('admin', {
|
||||
users: usersWithRoles,
|
||||
ldapConfig: ldapConfig || null,
|
||||
syncLogs: syncLogs || [],
|
||||
user: {
|
||||
firstname: req.session.firstname,
|
||||
lastname: req.session.lastname,
|
||||
roles: req.session.roles || [],
|
||||
currentRole: req.session.currentRole || 'admin'
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Benutzer erstellen
|
||||
app.post('/admin/users', requireAdmin, (req, res) => {
|
||||
const { username, password, firstname, lastname, roles, personalnummer, wochenstunden, urlaubstage } = req.body;
|
||||
const hashedPassword = bcrypt.hashSync(password, 10);
|
||||
|
||||
// Normalisiere die optionalen Felder
|
||||
const normalizedPersonalnummer = personalnummer && personalnummer.trim() !== '' ? personalnummer.trim() : null;
|
||||
const normalizedWochenstunden = wochenstunden && wochenstunden !== '' ? parseFloat(wochenstunden) : null;
|
||||
const normalizedUrlaubstage = urlaubstage && urlaubstage !== '' ? parseFloat(urlaubstage) : null;
|
||||
|
||||
// Rollen verarbeiten: Erwarte Array, konvertiere zu JSON-String
|
||||
let rolesArray = [];
|
||||
if (Array.isArray(roles)) {
|
||||
rolesArray = roles.filter(r => r && ['mitarbeiter', 'verwaltung', 'admin'].includes(r));
|
||||
} else if (roles) {
|
||||
// Fallback: Einzelne Rolle als Array
|
||||
rolesArray = [roles];
|
||||
}
|
||||
|
||||
// Mindestens eine Rolle erforderlich
|
||||
if (rolesArray.length === 0) {
|
||||
rolesArray = ['mitarbeiter']; // Standard-Rolle
|
||||
}
|
||||
|
||||
const rolesJson = JSON.stringify(rolesArray);
|
||||
|
||||
db.run('INSERT INTO users (username, password, firstname, lastname, role, personalnummer, wochenstunden, urlaubstage) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
|
||||
[username, hashedPassword, firstname, lastname, rolesJson, normalizedPersonalnummer, normalizedWochenstunden, normalizedUrlaubstage],
|
||||
(err) => {
|
||||
if (err) {
|
||||
return res.status(400).json({ error: 'Benutzername existiert bereits' });
|
||||
}
|
||||
res.json({ success: true });
|
||||
});
|
||||
});
|
||||
|
||||
// Benutzer löschen
|
||||
app.delete('/admin/users/:id', requireAdmin, (req, res) => {
|
||||
const userId = req.params.id;
|
||||
|
||||
// Admin darf sich nicht selbst löschen
|
||||
if (userId == req.session.userId) {
|
||||
return res.status(400).json({ error: 'Sie können sich nicht selbst löschen' });
|
||||
}
|
||||
|
||||
db.run('DELETE FROM users WHERE id = ?', [userId], (err) => {
|
||||
if (err) {
|
||||
return res.status(500).json({ error: 'Fehler beim Löschen' });
|
||||
}
|
||||
res.json({ success: true });
|
||||
});
|
||||
});
|
||||
|
||||
// Benutzer aktualisieren (Personalnummer, Wochenstunden, Urlaubstage, Rollen)
|
||||
app.put('/admin/users/:id', requireAdmin, (req, res) => {
|
||||
const userId = req.params.id;
|
||||
const { personalnummer, wochenstunden, urlaubstage, roles } = req.body;
|
||||
|
||||
// Rollen verarbeiten falls vorhanden
|
||||
let rolesJson = null;
|
||||
if (roles !== undefined) {
|
||||
let rolesArray = [];
|
||||
if (Array.isArray(roles)) {
|
||||
rolesArray = roles.filter(r => r && ['mitarbeiter', 'verwaltung', 'admin'].includes(r));
|
||||
}
|
||||
// Mindestens eine Rolle erforderlich
|
||||
if (rolesArray.length === 0) {
|
||||
return res.status(400).json({ error: 'Mindestens eine Rolle ist erforderlich' });
|
||||
}
|
||||
rolesJson = JSON.stringify(rolesArray);
|
||||
}
|
||||
|
||||
// SQL-Query dynamisch zusammenstellen
|
||||
if (rolesJson !== null) {
|
||||
// Aktualisiere auch Rollen
|
||||
db.run('UPDATE users SET personalnummer = ?, wochenstunden = ?, urlaubstage = ?, role = ? WHERE id = ?',
|
||||
[
|
||||
personalnummer || null,
|
||||
wochenstunden ? parseFloat(wochenstunden) : null,
|
||||
urlaubstage ? parseFloat(urlaubstage) : null,
|
||||
rolesJson,
|
||||
userId
|
||||
],
|
||||
(err) => {
|
||||
if (err) {
|
||||
return res.status(500).json({ error: 'Fehler beim Aktualisieren' });
|
||||
}
|
||||
res.json({ success: true });
|
||||
});
|
||||
} else {
|
||||
// Nur andere Felder aktualisieren
|
||||
db.run('UPDATE users SET personalnummer = ?, wochenstunden = ?, urlaubstage = ? WHERE id = ?',
|
||||
[
|
||||
personalnummer || null,
|
||||
wochenstunden ? parseFloat(wochenstunden) : null,
|
||||
urlaubstage ? parseFloat(urlaubstage) : null,
|
||||
userId
|
||||
],
|
||||
(err) => {
|
||||
if (err) {
|
||||
return res.status(500).json({ error: 'Fehler beim Aktualisieren' });
|
||||
}
|
||||
res.json({ success: true });
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = registerAdminRoutes;
|
||||
Reference in New Issue
Block a user