Refactor member acceptance logic in API to improve handling of legacy records. Remove debug logging and clarify acceptance criteria for manual members.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 57s
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 57s
This commit is contained in:
@@ -182,9 +182,9 @@
|
|||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-3 whitespace-nowrap">
|
<td class="px-4 py-3 whitespace-nowrap">
|
||||||
<span
|
<span
|
||||||
:class="member.hasHallKey ? 'text-amber-600' : 'text-gray-300'"
|
v-if="member.hasHallKey"
|
||||||
:title="member.hasHallKey ? 'Hat Hallenschlüssel' : 'Hat keinen Hallenschlüssel'"
|
class="text-lg text-amber-600"
|
||||||
class="text-lg"
|
title="Hat Hallenschlüssel"
|
||||||
>
|
>
|
||||||
🔑
|
🔑
|
||||||
</span>
|
</span>
|
||||||
@@ -263,8 +263,9 @@
|
|||||||
{{ member.name }}
|
{{ member.name }}
|
||||||
</h3>
|
</h3>
|
||||||
<span
|
<span
|
||||||
:class="member.hasHallKey ? 'ml-2 text-amber-600' : 'ml-2 text-gray-300'"
|
v-if="member.hasHallKey"
|
||||||
:title="member.hasHallKey ? 'Hat Hallenschlüssel' : 'Hat keinen Hallenschlüssel'"
|
class="ml-2 text-amber-600"
|
||||||
|
title="Hat Hallenschlüssel"
|
||||||
>
|
>
|
||||||
🔑
|
🔑
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -189,9 +189,9 @@
|
|||||||
</td>
|
</td>
|
||||||
<td class="px-4 py-3 whitespace-nowrap">
|
<td class="px-4 py-3 whitespace-nowrap">
|
||||||
<span
|
<span
|
||||||
:class="member.hasHallKey ? 'text-amber-600' : 'text-gray-300'"
|
v-if="member.hasHallKey"
|
||||||
:title="member.hasHallKey ? 'Hat Hallenschlüssel' : 'Hat keinen Hallenschlüssel'"
|
class="text-lg text-amber-600"
|
||||||
class="text-lg"
|
title="Hat Hallenschlüssel"
|
||||||
>
|
>
|
||||||
🔑
|
🔑
|
||||||
</span>
|
</span>
|
||||||
@@ -278,8 +278,9 @@
|
|||||||
</span>
|
</span>
|
||||||
</h3>
|
</h3>
|
||||||
<span
|
<span
|
||||||
:class="member.hasHallKey ? 'ml-2 text-amber-600' : 'ml-2 text-gray-300'"
|
v-if="member.hasHallKey"
|
||||||
:title="member.hasHallKey ? 'Hat Hallenschlüssel' : 'Hat keinen Hallenschlüssel'"
|
class="ml-2 text-amber-600"
|
||||||
|
title="Hat Hallenschlüssel"
|
||||||
>
|
>
|
||||||
🔑
|
🔑
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -28,17 +28,6 @@ export default defineEventHandler(async (event) => {
|
|||||||
const manualMembers = await readMembers()
|
const manualMembers = await readMembers()
|
||||||
const registeredUsers = await readUsers()
|
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
|
// Merge members: combine manual + registered, detect duplicates
|
||||||
const mergedMembers = []
|
const mergedMembers = []
|
||||||
|
|
||||||
@@ -46,11 +35,19 @@ export default defineEventHandler(async (event) => {
|
|||||||
const emailToIndexMap = new Map() // email -> index in mergedMembers
|
const emailToIndexMap = new Map() // email -> index in mergedMembers
|
||||||
const nameToIndexMap = new Map() // name -> 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++) {
|
for (let i = 0; i < manualMembers.length; i++) {
|
||||||
const member = manualMembers[i]
|
const member = manualMembers[i]
|
||||||
// Normalize acceptance flags: accept if member.active===true or member.status==='accepted' or member.accepted===true
|
const normalizedStatus = member.status ? String(member.status).toLowerCase() : ''
|
||||||
const isAccepted = member.active === true || (member.status && String(member.status).toLowerCase() === 'accepted') || member.accepted === true
|
const hasExplicitAcceptanceFlag = member.active !== undefined || member.accepted !== undefined || normalizedStatus !== ''
|
||||||
|
const isAccepted = hasExplicitAcceptanceFlag
|
||||||
|
? (
|
||||||
|
member.active === true ||
|
||||||
|
member.accepted === true ||
|
||||||
|
normalizedStatus === 'accepted'
|
||||||
|
)
|
||||||
|
: true
|
||||||
if (!isAccepted) {
|
if (!isAccepted) {
|
||||||
// Skip applications that are not yet accepted
|
// Skip applications that are not yet accepted
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ describe('Members API Endpoints', () => {
|
|||||||
const event = createEvent({ cookies: { auth_token: 'token' } })
|
const event = createEvent({ cookies: { auth_token: 'token' } })
|
||||||
authUtils.verifyToken.mockReturnValue({ id: '1' })
|
authUtils.verifyToken.mockReturnValue({ id: '1' })
|
||||||
memberUtils.readMembers.mockResolvedValue([
|
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([
|
authUtils.readUsers.mockResolvedValue([
|
||||||
{ id: 'u1', name: 'Ben Nutzer', email: 'ben@club.de', role: 'mitglied', active: true }
|
{ 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).toHaveLength(2)
|
||||||
expect(response.members[0]).toHaveProperty('hasHallKey', true)
|
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', () => {
|
describe('POST /api/members', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user