diff --git a/pages/mitgliederbereich/mitglieder.vue b/pages/mitgliederbereich/mitglieder.vue index 935394b..a192c07 100644 --- a/pages/mitgliederbereich/mitglieder.vue +++ b/pages/mitgliederbereich/mitglieder.vue @@ -81,13 +81,30 @@ Nur für Vorstand - - Ja + {{ member.isMannschaftsspieler ? 'Ja' : 'Nein' }} + + + {{ member.isMannschaftsspieler ? 'Ja' : 'Nein' }} - -
@@ -163,11 +180,29 @@ > Aus Login-System - - Mannschaftsspieler + Mannschaftsspieler: {{ member.isMannschaftsspieler ? 'Ja' : 'Nein' }} + + + Mannschaftsspieler: {{ member.isMannschaftsspieler ? 'Ja' : 'Nein' }}
@@ -618,6 +653,27 @@ const saveMember = async () => { } } +const toggleMannschaftsspieler = async (member) => { + try { + const response = await $fetch('/api/members/toggle-mannschaftsspieler', { + method: 'POST', + body: { memberId: member.id } + }) + + // Update local state immediately + member.isMannschaftsspieler = response.isMannschaftsspieler + + // Reload to ensure consistency + await loadMembers() + } catch (error) { + console.error('Fehler beim Umschalten des Mannschaftsspieler-Status:', error) + const errorMsg = error.data?.message || error.message || 'Fehler beim Umschalten des Status.' + if (window.showErrorModal) { + window.showErrorModal('Fehler', errorMsg) + } + } +} + const confirmDelete = async (member) => { window.showConfirmModal('Mitglied löschen', `Möchten Sie "${member.name}" wirklich löschen?`, async () => { try { diff --git a/server/api/members.get.js b/server/api/members.get.js index 409584a..7d78a44 100644 --- a/server/api/members.get.js +++ b/server/api/members.get.js @@ -83,7 +83,8 @@ export default defineEventHandler(async (event) => { loginEmail: user.email, loginRoles: roles, loginRole: roles[0] || 'mitglied', // Rückwärtskompatibilität - lastLogin: user.lastLogin + lastLogin: user.lastLogin, + isMannschaftsspieler: user.isMannschaftsspieler === true || mergedMembers[matchedManualIndex].isMannschaftsspieler === true } } else { // Add as new member (from login system) @@ -102,7 +103,8 @@ export default defineEventHandler(async (event) => { loginEmail: user.email, loginRoles: roles, loginRole: roles[0] || 'mitglied', // Rückwärtskompatibilität - lastLogin: user.lastLogin + lastLogin: user.lastLogin, + isMannschaftsspieler: user.isMannschaftsspieler === true }) } } diff --git a/server/api/members/toggle-mannschaftsspieler.post.js b/server/api/members/toggle-mannschaftsspieler.post.js new file mode 100644 index 0000000..adb91e9 --- /dev/null +++ b/server/api/members/toggle-mannschaftsspieler.post.js @@ -0,0 +1,105 @@ +import { verifyToken, getUserById, hasAnyRole, readUsers, writeUsers } from '../../utils/auth.js' +import { readMembers, writeMembers, getMemberById } from '../../utils/members.js' + +export default defineEventHandler(async (event) => { + try { + // Support both Cookie and Authorization Header + let token = getCookie(event, 'auth_token') + + if (!token) { + const authHeader = getHeader(event, 'authorization') + if (authHeader && authHeader.startsWith('Bearer ')) { + token = authHeader.substring(7) + } + } + + if (!token) { + throw createError({ + statusCode: 401, + message: 'Nicht authentifiziert.' + }) + } + + const decoded = verifyToken(token) + + if (!decoded) { + throw createError({ + statusCode: 401, + message: 'Ungültiges Token.' + }) + } + + const user = await getUserById(decoded.id) + + if (!user) { + throw createError({ + statusCode: 401, + message: 'Benutzer nicht gefunden.' + }) + } + + // Only admin and vorstand can toggle this flag + if (!hasAnyRole(user, 'admin', 'vorstand')) { + throw createError({ + statusCode: 403, + message: 'Keine Berechtigung.' + }) + } + + const body = await readBody(event) + const { memberId } = body + + if (!memberId) { + throw createError({ + statusCode: 400, + message: 'Mitglieds-ID ist erforderlich.' + }) + } + + // Prüfe ob es ein Login-System-Mitglied ist (user.id === memberId) + const users = await readUsers() + const loginUser = users.find(u => u.id === memberId) + + if (loginUser) { + // Login-System-Mitglied: Flag in users.json speichern + loginUser.isMannschaftsspieler = !loginUser.isMannschaftsspieler + await writeUsers(users) + + return { + success: true, + message: 'Mannschaftsspieler-Status aktualisiert.', + isMannschaftsspieler: loginUser.isMannschaftsspieler + } + } else { + // Manuelles Mitglied: Flag in members.json speichern + const members = await readMembers() + const member = members.find(m => m.id === memberId) + + if (!member) { + throw createError({ + statusCode: 404, + message: 'Mitglied nicht gefunden.' + }) + } + + member.isMannschaftsspieler = !member.isMannschaftsspieler + await writeMembers(members) + + return { + success: true, + message: 'Mannschaftsspieler-Status aktualisiert.', + isMannschaftsspieler: member.isMannschaftsspieler + } + } + } catch (error) { + console.error('Fehler beim Umschalten des Mannschaftsspieler-Status:', error) + if (error.statusCode) { + throw error + } + throw createError({ + statusCode: error.statusCode || 500, + message: error.message || 'Fehler beim Umschalten des Mannschaftsspieler-Status.' + }) + } +}) +