monacousa-portal/server/api/admin/users.get.ts

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
}
};
}
});