288 lines
6.6 KiB
JavaScript
Executable File
288 lines
6.6 KiB
JavaScript
Executable File
const authService = require('../services/AuthService');
|
|
|
|
/**
|
|
* Authentication Controller
|
|
* Verwaltet Auth-bezogene HTTP-Requests
|
|
*/
|
|
class AuthController {
|
|
/**
|
|
* Benutzer registrieren
|
|
* POST /api/auth/register
|
|
*/
|
|
async register(req, res) {
|
|
try {
|
|
const { email, password, full_name } = req.body;
|
|
|
|
const result = await authService.register({
|
|
email,
|
|
password,
|
|
full_name
|
|
});
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: 'Registrierung erfolgreich',
|
|
user: result.user
|
|
});
|
|
} catch (error) {
|
|
console.error('Registrierungsfehler:', error);
|
|
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Benutzer einloggen
|
|
* POST /api/auth/login
|
|
*/
|
|
async login(req, res) {
|
|
try {
|
|
const { email, password, action } = req.body;
|
|
|
|
if (!email || !password) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: 'E-Mail und Passwort sind erforderlich'
|
|
});
|
|
}
|
|
|
|
const result = await authService.login(email, password, action);
|
|
|
|
const response = {
|
|
success: true,
|
|
message: 'Login erfolgreich',
|
|
token: result.token,
|
|
user: result.user
|
|
};
|
|
|
|
// Füge Warnung hinzu, falls vorhanden
|
|
if (result.actionWarning) {
|
|
response.actionWarning = result.actionWarning;
|
|
}
|
|
|
|
res.json(response);
|
|
} catch (error) {
|
|
console.error('Login-Fehler:', error);
|
|
|
|
res.status(401).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ausloggen
|
|
* POST /api/auth/logout
|
|
*/
|
|
async logout(req, res) {
|
|
try {
|
|
const token = req.headers.authorization?.replace('Bearer ', '');
|
|
|
|
if (token) {
|
|
await authService.logout(token);
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Logout erfolgreich'
|
|
});
|
|
} catch (error) {
|
|
console.error('Logout-Fehler:', error);
|
|
|
|
res.status(500).json({
|
|
success: false,
|
|
error: 'Fehler beim Logout'
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Aktuellen Benutzer abrufen
|
|
* GET /api/auth/me
|
|
*/
|
|
async getCurrentUser(req, res) {
|
|
try {
|
|
const userId = req.user.userId;
|
|
|
|
const profile = await authService.getUserProfile(userId);
|
|
|
|
res.json({
|
|
success: true,
|
|
user: profile
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Abrufen des Benutzers:', error);
|
|
|
|
res.status(500).json({
|
|
success: false,
|
|
error: 'Fehler beim Abrufen der Benutzerdaten'
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Passwort-Reset anfordern
|
|
* POST /api/auth/request-reset
|
|
*/
|
|
async requestPasswordReset(req, res) {
|
|
try {
|
|
const { email } = req.body;
|
|
|
|
if (!email) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: 'E-Mail ist erforderlich'
|
|
});
|
|
}
|
|
|
|
const resetToken = await authService.requestPasswordReset(email);
|
|
|
|
// Debug-Logs
|
|
console.log('Reset-Token:', resetToken);
|
|
console.log('NODE_ENV:', process.env.NODE_ENV);
|
|
console.log('isDevelopment:', !process.env.NODE_ENV || process.env.NODE_ENV === 'development');
|
|
|
|
// In Produktion: E-Mail mit Reset-Link senden
|
|
// Für Entwicklung: Token zurückgeben (auch wenn E-Mail nicht existiert)
|
|
const isDevelopment = !process.env.NODE_ENV || process.env.NODE_ENV === 'development';
|
|
|
|
if (isDevelopment) {
|
|
// Im Development-Modus immer einen Token zurückgeben für Testing
|
|
const devToken = resetToken || 'dev-test-token-' + Date.now() + '-' + email;
|
|
res.json({
|
|
success: true,
|
|
message: 'Reset-Link wurde gesendet (DEV)',
|
|
resetToken: devToken // NUR FÜR ENTWICKLUNG!
|
|
});
|
|
} else {
|
|
res.json({
|
|
success: true,
|
|
message: 'Falls ein Account mit dieser E-Mail existiert, wurde ein Reset-Link gesendet'
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Fehler bei Passwort-Reset-Anfrage:', error);
|
|
|
|
res.status(500).json({
|
|
success: false,
|
|
error: 'Fehler beim Senden des Reset-Links'
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Passwort zurücksetzen
|
|
* POST /api/auth/reset-password
|
|
*/
|
|
async resetPassword(req, res) {
|
|
try {
|
|
const { token, password } = req.body;
|
|
|
|
if (!token || !password) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: 'Token und neues Passwort sind erforderlich'
|
|
});
|
|
}
|
|
|
|
await authService.resetPassword(token, password);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Passwort wurde erfolgreich zurückgesetzt'
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Passwort-Reset:', error);
|
|
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Passwort ändern (eingeloggter Benutzer)
|
|
* POST /api/auth/change-password
|
|
*/
|
|
async changePassword(req, res) {
|
|
try {
|
|
const userId = req.user.userId;
|
|
const { oldPassword, newPassword } = req.body;
|
|
|
|
if (!oldPassword || !newPassword) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
error: 'Altes und neues Passwort sind erforderlich'
|
|
});
|
|
}
|
|
|
|
await authService.changePassword(userId, oldPassword, newPassword);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Passwort wurde erfolgreich geändert'
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Passwort-Ändern:', error);
|
|
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Token validieren
|
|
* GET /api/auth/validate
|
|
*/
|
|
async validateToken(req, res) {
|
|
try {
|
|
// Wenn Middleware durchgelaufen ist, ist Token valid
|
|
res.json({
|
|
success: true,
|
|
valid: true,
|
|
user: req.user
|
|
});
|
|
} catch (error) {
|
|
res.status(401).json({
|
|
success: false,
|
|
valid: false,
|
|
error: 'Ungültiger Token'
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Eigenen Account und personenbezogene Daten löschen
|
|
* DELETE /api/auth/account
|
|
*/
|
|
async deleteAccount(req, res) {
|
|
try {
|
|
const userId = req.user.userId;
|
|
const { confirmation } = req.body;
|
|
|
|
await authService.deleteAccount(userId, confirmation);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Account wurde gelöscht'
|
|
});
|
|
} catch (error) {
|
|
console.error('Fehler beim Löschen des Accounts:', error);
|
|
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = new AuthController();
|