141 lines
3.0 KiB
JavaScript
141 lines
3.0 KiB
JavaScript
const { User } = require('../models');
|
|
const bcrypt = require('bcryptjs');
|
|
|
|
class UserService {
|
|
/**
|
|
* Alle User abrufen (ohne sensible Daten)
|
|
*/
|
|
async getAllUsers() {
|
|
const users = await User.findAll({
|
|
order: [['name', 'ASC']],
|
|
attributes: ['id', 'name', 'email', 'active', 'created_at', 'updated_at']
|
|
});
|
|
return users;
|
|
}
|
|
|
|
/**
|
|
* User anhand ID abrufen (ohne sensible Daten)
|
|
*/
|
|
async getUserById(id) {
|
|
const user = await User.findByPk(id, {
|
|
attributes: ['id', 'name', 'email', 'active', 'created_at', 'updated_at']
|
|
});
|
|
|
|
if (!user) {
|
|
throw new Error('USER_NOT_FOUND');
|
|
}
|
|
|
|
return user;
|
|
}
|
|
|
|
/**
|
|
* Neuen User erstellen
|
|
*/
|
|
async createUser(userData) {
|
|
// Passwort hashen falls vorhanden
|
|
if (userData.password) {
|
|
userData.password = await bcrypt.hash(userData.password, 10);
|
|
}
|
|
|
|
const user = await User.create(userData);
|
|
|
|
// Sichere User-Daten zurückgeben
|
|
return this.getSafeUserData(user);
|
|
}
|
|
|
|
/**
|
|
* User aktualisieren (ohne sensible Felder)
|
|
*/
|
|
async updateUser(id, updateData) {
|
|
const user = await User.findByPk(id);
|
|
|
|
if (!user) {
|
|
throw new Error('USER_NOT_FOUND');
|
|
}
|
|
|
|
// Erstelle sichere Update-Daten
|
|
const safeUpdateData = this.getSafeUpdateData(updateData);
|
|
|
|
await user.update(safeUpdateData);
|
|
|
|
return this.getSafeUserData(user);
|
|
}
|
|
|
|
/**
|
|
* User löschen
|
|
*/
|
|
async deleteUser(id) {
|
|
const user = await User.findByPk(id);
|
|
|
|
if (!user) {
|
|
throw new Error('USER_NOT_FOUND');
|
|
}
|
|
|
|
await user.destroy();
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* User anhand E-Mail abrufen (für interne Verwendung)
|
|
*/
|
|
async getUserByEmail(email) {
|
|
return await User.findOne({ where: { email } });
|
|
}
|
|
|
|
/**
|
|
* Passwort ändern (separate Methode für sichere Passwort-Änderung)
|
|
*/
|
|
async changePassword(id, currentPassword, newPassword) {
|
|
const user = await User.findByPk(id);
|
|
|
|
if (!user) {
|
|
throw new Error('USER_NOT_FOUND');
|
|
}
|
|
|
|
// Aktuelles Passwort prüfen
|
|
const isValidPassword = await bcrypt.compare(currentPassword, user.password);
|
|
if (!isValidPassword) {
|
|
throw new Error('INVALID_CURRENT_PASSWORD');
|
|
}
|
|
|
|
// Neues Passwort hashen und speichern
|
|
const hashedPassword = await bcrypt.hash(newPassword, 10);
|
|
await user.update({ password: hashedPassword });
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Sichere User-Daten extrahieren (ohne Passwort)
|
|
*/
|
|
getSafeUserData(user) {
|
|
return {
|
|
id: user.id,
|
|
name: user.name,
|
|
email: user.email,
|
|
active: user.active,
|
|
created_at: user.created_at,
|
|
updated_at: user.updated_at
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Sichere Update-Daten erstellen (ohne sensible Felder)
|
|
*/
|
|
getSafeUpdateData(updateData) {
|
|
const safeData = { ...updateData };
|
|
|
|
// Entferne sensible Felder
|
|
delete safeData.password;
|
|
delete safeData.id;
|
|
delete safeData.created_at;
|
|
|
|
// Setze updated_at
|
|
safeData.updated_at = new Date();
|
|
|
|
return safeData;
|
|
}
|
|
}
|
|
|
|
module.exports = new UserService();
|