From 381ec55fd192dea64dc4e9c41a2c525141b71a36 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sun, 29 Mar 2026 15:00:53 +0200 Subject: [PATCH] Refactor member acceptance logic in API to improve handling of legacy records. Remove debug logging and clarify acceptance criteria for manual members. --- components/cms/CmsMitglieder.vue | 11 ++++++----- pages/mitgliederbereich/mitglieder.vue | 11 ++++++----- server/api/members.get.js | 25 +++++++++++-------------- tests/members-endpoints.spec.ts | 19 ++++++++++++++++++- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/components/cms/CmsMitglieder.vue b/components/cms/CmsMitglieder.vue index cbb07cb..86b1ca4 100644 --- a/components/cms/CmsMitglieder.vue +++ b/components/cms/CmsMitglieder.vue @@ -182,9 +182,9 @@ 🔑 @@ -263,8 +263,9 @@ {{ member.name }} 🔑 diff --git a/pages/mitgliederbereich/mitglieder.vue b/pages/mitgliederbereich/mitglieder.vue index 0d8de08..9264a31 100644 --- a/pages/mitgliederbereich/mitglieder.vue +++ b/pages/mitgliederbereich/mitglieder.vue @@ -189,9 +189,9 @@ 🔑 @@ -278,8 +278,9 @@ 🔑 diff --git a/server/api/members.get.js b/server/api/members.get.js index 6550998..a605d83 100644 --- a/server/api/members.get.js +++ b/server/api/members.get.js @@ -28,17 +28,6 @@ export default defineEventHandler(async (event) => { const manualMembers = await readMembers() const registeredUsers = await readUsers() - // Debug: Log alle geladenen Mitglieder (decryptet) - console.log('--- DEBUG: Decrypted manualMembers ---') - if (Array.isArray(manualMembers)) { - for (const m of manualMembers) { - console.log(JSON.stringify(m, null, 2)) - } - console.log('--- Gesamt:', manualMembers.length, 'Mitglieder ---') - } else { - console.log('manualMembers ist kein Array:', manualMembers) - } - // Merge members: combine manual + registered, detect duplicates const mergedMembers = [] @@ -46,11 +35,19 @@ export default defineEventHandler(async (event) => { const emailToIndexMap = new Map() // email -> index in mergedMembers const nameToIndexMap = new Map() // name -> index in mergedMembers - // First, add manual members that are active/accepted (filter out pending applications) + // First, add manual members. Legacy records without explicit status flags + // are treated as accepted members; only explicit non-accepted records are skipped. 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 + const normalizedStatus = member.status ? String(member.status).toLowerCase() : '' + const hasExplicitAcceptanceFlag = member.active !== undefined || member.accepted !== undefined || normalizedStatus !== '' + const isAccepted = hasExplicitAcceptanceFlag + ? ( + member.active === true || + member.accepted === true || + normalizedStatus === 'accepted' + ) + : true if (!isAccepted) { // Skip applications that are not yet accepted continue diff --git a/tests/members-endpoints.spec.ts b/tests/members-endpoints.spec.ts index 0951e97..f2f7b68 100644 --- a/tests/members-endpoints.spec.ts +++ b/tests/members-endpoints.spec.ts @@ -64,7 +64,7 @@ describe('Members API Endpoints', () => { const event = createEvent({ cookies: { auth_token: 'token' } }) authUtils.verifyToken.mockReturnValue({ id: '1' }) memberUtils.readMembers.mockResolvedValue([ - { id: 'm1', firstName: 'Anna', lastName: 'Muster', email: 'anna@club.de', hasHallKey: true, active: true } + { id: 'm1', firstName: 'Anna', lastName: 'Muster', email: 'anna@club.de', hasHallKey: true } ]) authUtils.readUsers.mockResolvedValue([ { id: 'u1', name: 'Ben Nutzer', email: 'ben@club.de', role: 'mitglied', active: true } @@ -77,6 +77,23 @@ describe('Members API Endpoints', () => { expect(response.members).toHaveLength(2) expect(response.members[0]).toHaveProperty('hasHallKey', true) }) + + it('zeigt Legacy-Mitglieder ohne active-Flag weiterhin an', async () => { + const event = createEvent({ cookies: { auth_token: 'token' } }) + authUtils.verifyToken.mockReturnValue({ id: '1' }) + memberUtils.readMembers.mockResolvedValue([ + { id: 'm1', firstName: 'Anna', lastName: 'Muster', geburtsdatum: '2000-01-01' }, + { id: 'm2', firstName: 'Offen', lastName: 'Antrag', geburtsdatum: '2001-01-01', status: 'pending' } + ]) + authUtils.readUsers.mockResolvedValue([]) + authUtils.getUserFromToken.mockResolvedValue({ id: '1', role: 'mitglied' }) + + const response = await membersGetHandler(event) + + expect(response.success).toBe(true) + expect(response.members).toHaveLength(1) + expect(response.members[0].name).toBe('Anna Muster') + }) }) describe('POST /api/members', () => {