diff --git a/controllers/authController.js b/controllers/authController.js index bfa226f..8ab52b8 100644 --- a/controllers/authController.js +++ b/controllers/authController.js @@ -3,6 +3,10 @@ const { User } = require('../models'); const jwt = require('jsonwebtoken'); const { addTokenToBlacklist } = require('../utils/blacklist'); +function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + exports.register = async (req, res) => { const { name, email, password } = req.body; if (!name || !email || !password) { @@ -10,13 +14,52 @@ exports.register = async (req, res) => { } try { const hashedPassword = await bcrypt.hash(password, 10); - const user = await User.create({ name, email, password: hashedPassword, active: true }); - res.status(201).json({ message: 'Benutzer erfolgreich registriert', user }); + console.log('Register: creating user', { email }); + + const maxAttempts = 3; + let attempt = 0; + let createdUser = null; + let lastError = null; + + while (attempt < maxAttempts && !createdUser) { + try { + createdUser = await User.create({ name, email, password: hashedPassword, active: true }); + } catch (err) { + lastError = err; + // Spezifisch auf Lock-Timeout reagieren und erneut versuchen + if ((err.code === 'ER_LOCK_WAIT_TIMEOUT' || err?.parent?.code === 'ER_LOCK_WAIT_TIMEOUT') && attempt < maxAttempts - 1) { + const backoffMs = 300 * (attempt + 1); + console.warn(`Register: ER_LOCK_WAIT_TIMEOUT, retry in ${backoffMs}ms (attempt ${attempt + 1}/${maxAttempts})`); + await delay(backoffMs); + attempt++; + continue; + } + throw err; + } + } + + if (!createdUser && lastError) { + console.error('Register error (after retries):', lastError); + return res.status(503).json({ message: 'Zeitüberschreitung beim Zugriff auf die Datenbank. Bitte erneut versuchen.' }); + } + + console.log('Register: user created', { id: createdUser.id }); + + const safeUser = { + id: createdUser.id, + name: createdUser.name, + email: createdUser.email, + active: createdUser.active, + created_at: createdUser.created_at + }; + + return res.status(201).json({ message: 'Benutzer erfolgreich registriert', user: safeUser }); } catch (error) { if (error.name === 'SequelizeUniqueConstraintError') { return res.status(400).json({ message: 'Email-Adresse bereits in Verwendung' }); } - res.status(500).json({ message: 'Ein Fehler ist aufgetreten' }); + console.error('Register error:', error); + return res.status(500).json({ message: 'Ein Fehler ist aufgetreten', error: error.message }); } }; @@ -38,9 +81,9 @@ exports.login = async (req, res) => { return res.status(403).json({ message: 'Benutzerkonto ist nicht aktiv' }); } const token = jwt.sign({ id: user.id, name: user.name, email: user.email }, 'zTxVgptmPl9!_dr%xxx9999(dd)', { expiresIn: '1h' }); - res.status(200).json({ message: 'Login erfolgreich', token, 'user': user }); + return res.status(200).json({ message: 'Login erfolgreich', token, 'user': user }); } catch (error) { - res.status(500).json({ message: 'Ein Fehler ist aufgetreten' }); + return res.status(500).json({ message: 'Ein Fehler ist aufgetreten' }); } }; @@ -52,9 +95,9 @@ exports.logout = async (req, res) => { const token = authHeader.replace('Bearer ', ''); try { addTokenToBlacklist(token); - res.status(200).json({ message: 'Logout erfolgreich' }); + return res.status(200).json({ message: 'Logout erfolgreich' }); } catch (error) { console.log(error); - res.status(500).json({ message: 'Ein Fehler ist beim Logout aufgetreten' }); + return res.status(500).json({ message: 'Ein Fehler ist beim Logout aufgetreten' }); } }; diff --git a/src/content/authentication/RegisterContent.vue b/src/content/authentication/RegisterContent.vue index 31ca018..8808c92 100644 --- a/src/content/authentication/RegisterContent.vue +++ b/src/content/authentication/RegisterContent.vue @@ -19,10 +19,19 @@
{{ dialogMessage }}
+ +