64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
// 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
|
|
}
|
|
};
|
|
}
|
|
}); |