104 lines
2.6 KiB
JavaScript
104 lines
2.6 KiB
JavaScript
import { verifyToken, readUsers, writeUsers, verifyPassword, hashPassword, migrateUserRoles } from '../utils/auth.js'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
const token = getCookie(event, 'auth_token')
|
|
|
|
if (!token) {
|
|
throw createError({
|
|
statusCode: 401,
|
|
message: 'Nicht authentifiziert.'
|
|
})
|
|
}
|
|
|
|
const decoded = verifyToken(token)
|
|
|
|
if (!decoded) {
|
|
throw createError({
|
|
statusCode: 401,
|
|
message: 'Ungültiges Token.'
|
|
})
|
|
}
|
|
|
|
const body = await readBody(event)
|
|
const { name, email, phone, currentPassword, newPassword } = body
|
|
|
|
if (!name || !email) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: 'Name und E-Mail sind erforderlich.'
|
|
})
|
|
}
|
|
|
|
const users = await readUsers()
|
|
const userIndex = users.findIndex(u => u.id === decoded.id)
|
|
|
|
if (userIndex === -1) {
|
|
throw createError({
|
|
statusCode: 404,
|
|
message: 'Benutzer nicht gefunden.'
|
|
})
|
|
}
|
|
|
|
const user = users[userIndex]
|
|
|
|
// Check if email is already taken by another user
|
|
if (email !== user.email) {
|
|
const emailExists = users.some(u => u.email === email && u.id !== user.id)
|
|
if (emailExists) {
|
|
throw createError({
|
|
statusCode: 409,
|
|
message: 'Diese E-Mail-Adresse wird bereits verwendet.'
|
|
})
|
|
}
|
|
}
|
|
|
|
// Update basic info
|
|
user.name = name
|
|
user.email = email
|
|
user.phone = phone || ''
|
|
|
|
// Handle password change
|
|
if (currentPassword && newPassword) {
|
|
const isValid = await verifyPassword(currentPassword, user.password)
|
|
if (!isValid) {
|
|
throw createError({
|
|
statusCode: 401,
|
|
message: 'Aktuelles Passwort ist falsch.'
|
|
})
|
|
}
|
|
|
|
if (newPassword.length < 6) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: 'Das neue Passwort muss mindestens 6 Zeichen lang sein.'
|
|
})
|
|
}
|
|
|
|
user.password = await hashPassword(newPassword)
|
|
}
|
|
|
|
await writeUsers(users)
|
|
|
|
const migratedUser = migrateUserRoles({ ...user })
|
|
const roles = Array.isArray(migratedUser.roles) ? migratedUser.roles : (migratedUser.role ? [migratedUser.role] : ['mitglied'])
|
|
|
|
return {
|
|
success: true,
|
|
message: 'Profil erfolgreich aktualisiert.',
|
|
user: {
|
|
id: user.id,
|
|
email: user.email,
|
|
name: user.name,
|
|
phone: user.phone,
|
|
roles: roles,
|
|
role: roles[0] || 'mitglied' // Rückwärtskompatibilität
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Profil-Update-Fehler:', error)
|
|
throw error
|
|
}
|
|
})
|
|
|