From 8a1e309ebaa24d834ca5f348c1f0ebc70d189644 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 11 Feb 2026 12:49:14 +0100 Subject: [PATCH] =?UTF-8?q?Verbessere=20Mitgliederabfrage:=20Filtere=20man?= =?UTF-8?q?uelle=20Mitglieder=20nach=20aktiven/akzeptierten=20Status=20und?= =?UTF-8?q?=20entferne=20nicht=20ben=C3=B6tigte=20Datenschutzlogik.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/members.get.js | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/server/api/members.get.js b/server/api/members.get.js index b5221d6..1668795 100644 --- a/server/api/members.get.js +++ b/server/api/members.get.js @@ -24,9 +24,9 @@ export default defineEventHandler(async (event) => { const currentUser = await getUserFromToken(token) - // Get manual members and registered users - const manualMembers = await readMembers() - const registeredUsers = await readUsers() + // Get manual members and registered users + const manualMembers = await readMembers() + const registeredUsers = await readUsers() // Merge members: combine manual + registered, detect duplicates const mergedMembers = [] @@ -35,9 +35,15 @@ export default defineEventHandler(async (event) => { const emailToIndexMap = new Map() // email -> index in mergedMembers const nameToIndexMap = new Map() // name -> index in mergedMembers - // First, add all manual members and build lookup maps + // First, add manual members that are active/accepted (filter out pending applications) for (let i = 0; i < manualMembers.length; i++) { const member = manualMembers[i] + // Normalize acceptance flags: accept if member.active===true or member.status==='accepted' or member.accepted===true + const isAccepted = member.active === true || (member.status && String(member.status).toLowerCase() === 'accepted') || member.accepted === true + if (!isAccepted) { + // Skip applications that are not yet accepted + continue + } const normalizedEmail = member.email?.toLowerCase().trim() || '' const fullName = `${member.firstName || ''} ${member.lastName || ''}`.trim() const normalizedName = fullName.toLowerCase() @@ -66,7 +72,7 @@ export default defineEventHandler(async (event) => { } } - // Then add registered users (only active ones) + // Then add registered users (only active ones) for (const user of registeredUsers) { if (!user.active) continue @@ -142,25 +148,12 @@ export default defineEventHandler(async (event) => { // Sort by name mergedMembers.sort((a, b) => a.name.localeCompare(b.name)) - - // Serverseitiger Datenschutz: nur Vorstands-Mitglieder erhalten volle Kontaktdaten/Logindaten - const isVorstand = hasRole(currentUser, 'vorstand') - - // Für nicht-vorstandliche Anfragen liefern wir eine stark reduzierte, nicht-identifizierende - // Ansicht der Mitgliederliste (nur das Nötigste für öffentliche Anzeigen) - const safeMembers = isVorstand - ? mergedMembers - : mergedMembers.map(m => ({ - // Minimale, unkritische Felder - id: m.id, - name: m.name, - source: m.source, - isMannschaftsspieler: !!m.isMannschaftsspieler - })) - + // Die Mitgliederliste ist nur für authentifizierte Nutzer sichtbar (siehe oben). + // Entsprechend zeigen wir allen eingeloggten Nutzer*innen die vollständigen Kontaktdaten + // (inkl. Telefon und E-Mail) für alle aktiven Mitglieder. return { success: true, - members: safeMembers + members: mergedMembers } } catch (error) { console.error('Fehler beim Abrufen der Mitgliederliste:', error)