Benutzerverwaltung mit Rollen/Rechten und Urlaubsplanung

Führt Login mit vier Rollen (Admin, Teamleiter, Mitarbeiter, Beobachter) ein,
über die Teammitglieder eigenen Urlaub inkl. Pflicht-Vertreter eintragen
können. Die Auslastungsberechnung berücksichtigt Urlaub jetzt als reduzierte
Kapazität. Neue Konten vergeben ihr Passwort selbst beim ersten Login.
Migrationsskript für bestehende Mitarbeiter aus der Vorversion inklusive.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-10 22:57:25 +02:00
parent 60a0928d2f
commit 06ea149d41
20 changed files with 1139 additions and 91 deletions
+52
View File
@@ -0,0 +1,52 @@
const crypto = require('crypto');
const bcrypt = require('bcryptjs');
const db = require('./db');
const SESSION_LIFETIME_DAYS = 30;
function hashPassword(password) {
return bcrypt.hashSync(password, 10);
}
function verifyPassword(password, hash) {
return bcrypt.compareSync(password, hash);
}
function createSession(userId) {
db.prepare("DELETE FROM sessions WHERE expires_at <= datetime('now')").run();
const token = crypto.randomBytes(32).toString('hex');
db.prepare(
`INSERT INTO sessions (token, user_id, expires_at) VALUES (?, ?, datetime('now', '+${SESSION_LIFETIME_DAYS} days'))`
).run(token, userId);
return token;
}
function requireAuth(req, res, next) {
const header = req.get('authorization') || '';
const token = header.startsWith('Bearer ') ? header.slice(7) : null;
if (!token) return res.status(401).json({ error: 'nicht angemeldet' });
const row = db
.prepare(
`SELECT u.id, u.employee_id, u.email, u.role FROM sessions s
JOIN users u ON u.id = s.user_id
WHERE s.token = ? AND s.expires_at > datetime('now')`
)
.get(token);
if (!row) return res.status(401).json({ error: 'Sitzung ungültig oder abgelaufen' });
req.user = row;
req.sessionToken = token;
next();
}
function requireRole(...roles) {
return (req, res, next) => {
if (!req.user || !roles.includes(req.user.role)) {
return res.status(403).json({ error: 'keine Berechtigung' });
}
next();
};
}
module.exports = { hashPassword, verifyPassword, createSession, requireAuth, requireRole };