import express from 'express'; import bcrypt from 'bcrypt'; import jwt from 'jsonwebtoken'; import { body, validationResult } from 'express-validator'; import pool from '../config/database.js'; import { authenticateToken } from '../middleware/auth.js'; const router = express.Router(); // Login router.post('/login', [ body('email').isEmail().normalizeEmail(), body('password').notEmpty() ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { email, password } = req.body; try { const [rows] = await pool.query( 'SELECT * FROM mitarbeiter WHERE email = ?', [email] ); if (rows.length === 0) { return res.status(401).json({ error: 'Ungültige Anmeldedaten' }); } const mitarbeiter = rows[0]; const validPassword = await bcrypt.compare(password, mitarbeiter.password_hash); if (!validPassword) { return res.status(401).json({ error: 'Ungültige Anmeldedaten' }); } const token = jwt.sign( { id: mitarbeiter.id, email: mitarbeiter.email, rolle: mitarbeiter.rolle, name: mitarbeiter.name }, process.env.JWT_SECRET, { expiresIn: '24h' } ); res.json({ token, user: { id: mitarbeiter.id, email: mitarbeiter.email, name: mitarbeiter.name, rolle: mitarbeiter.rolle } }); } catch (error) { console.error('Login-Fehler:', error); res.status(500).json({ error: 'Serverfehler beim Login' }); } }); // Register (nur für Admin) router.post('/register', authenticateToken, [ body('email').isEmail().normalizeEmail(), body('password').isLength({ min: 6 }), body('name').notEmpty(), body('rolle').isIn(['user', 'admin']) ], async (req, res) => { // Nur Admins dürfen neue Benutzer anlegen if (req.user.rolle !== 'admin') { return res.status(403).json({ error: 'Keine Berechtigung' }); } const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { email, password, name, rolle } = req.body; try { // Prüfe ob Email bereits existiert const [existing] = await pool.query( 'SELECT id FROM mitarbeiter WHERE email = ?', [email] ); if (existing.length > 0) { return res.status(400).json({ error: 'Email bereits registriert' }); } const passwordHash = await bcrypt.hash(password, 10); const [result] = await pool.query( 'INSERT INTO mitarbeiter (email, password_hash, name, rolle) VALUES (?, ?, ?, ?)', [email, passwordHash, name, rolle] ); res.status(201).json({ message: 'Mitarbeiter erfolgreich angelegt', id: result.insertId }); } catch (error) { console.error('Registrierungs-Fehler:', error); res.status(500).json({ error: 'Serverfehler bei der Registrierung' }); } }); // Get current user router.get('/me', authenticateToken, async (req, res) => { try { const [rows] = await pool.query( 'SELECT id, email, name, rolle, erstellt_am FROM mitarbeiter WHERE id = ?', [req.user.id] ); if (rows.length === 0) { return res.status(404).json({ error: 'Benutzer nicht gefunden' }); } res.json(rows[0]); } catch (error) { console.error('Fehler beim Abrufen des Benutzers:', error); res.status(500).json({ error: 'Serverfehler' }); } }); // Change password router.post('/change-password', authenticateToken, [ body('currentPassword').notEmpty(), body('newPassword').isLength({ min: 6 }) ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { currentPassword, newPassword } = req.body; try { // Hole aktuellen Benutzer const [rows] = await pool.query( 'SELECT * FROM mitarbeiter WHERE id = ?', [req.user.id] ); if (rows.length === 0) { return res.status(404).json({ error: 'Benutzer nicht gefunden' }); } const mitarbeiter = rows[0]; // Prüfe aktuelles Passwort const validPassword = await bcrypt.compare(currentPassword, mitarbeiter.password_hash); if (!validPassword) { return res.status(401).json({ error: 'Aktuelles Passwort ist falsch' }); } // Hash neues Passwort const newPasswordHash = await bcrypt.hash(newPassword, 10); // Update Passwort await pool.query( 'UPDATE mitarbeiter SET password_hash = ? WHERE id = ?', [newPasswordHash, req.user.id] ); res.json({ message: 'Passwort erfolgreich geändert' }); } catch (error) { console.error('Fehler beim Ändern des Passworts:', error); res.status(500).json({ error: 'Serverfehler beim Ändern des Passworts' }); } }); export default router;