Replace all mock data in admin and board pages with real data
All checks were successful
Build And Push Image / docker (push) Successful in 1m56s

- Admin members page now loads real member data from NocoDB API
- Admin users page fetches actual users from Keycloak with tier determination
- Board members page uses real member data with proper transformations
- Admin payments page generates payment records from dues tracking data
- Created new /api/admin/users endpoint for Keycloak user management
- All stats cards now calculate from real data instead of hardcoded values
- Removed all mock/placeholder data arrays from production pages

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-31 18:43:04 +02:00
parent 1aef356d78
commit 70e79d2618
8 changed files with 601 additions and 508 deletions

View File

@@ -0,0 +1,64 @@
// server/api/admin/users.get.ts
export default defineEventHandler(async (event) => {
try {
const { createKeycloakAdminClient } = await import('~/server/utils/keycloak-admin');
const { determineMemberTierFromKeycloak } = await import('~/server/utils/member-tiers');
// Initialize Keycloak admin client
const keycloakAdmin = createKeycloakAdminClient();
// Get all users from Keycloak
const keycloakUsers = await keycloakAdmin.getUsers();
// Filter out service accounts and transform the data
const users = keycloakUsers
.filter((user: any) => !user.username?.startsWith('service-account-'))
.map((user: any) => {
// Determine tier/role from groups
const tierResult = determineMemberTierFromKeycloak(user);
return {
id: user.id,
username: user.username,
email: user.email,
firstName: user.firstName,
lastName: user.lastName,
enabled: user.enabled,
emailVerified: user.emailVerified,
createdTimestamp: user.createdTimestamp,
groups: user.groups || [],
tier: tierResult.tier,
tierSource: tierResult.source,
tierConfidence: tierResult.confidence,
// Note: Keycloak doesn't track last login by default
// This would need to be implemented via events or custom attributes
lastLogin: user.attributes?.lastLogin?.[0] || null
};
});
console.log(`[API] Retrieved ${users.length} users from Keycloak`);
return {
success: true,
data: {
users,
total: users.length,
dataSource: 'keycloak'
}
};
} catch (error: any) {
console.error('[API] Error fetching users:', error);
// Return empty list on error instead of throwing
return {
success: false,
data: {
users: [],
total: 0,
dataSource: 'unavailable',
error: error.message
}
};
}
});