38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import type { UserListResponse } from '@/lib/api/admin/AdminApiClient';
|
|
import { AdminUsersViewData } from '@/lib/view-data/AdminUsersViewData';
|
|
|
|
/**
|
|
* AdminUsersViewDataBuilder
|
|
*
|
|
* Server-side builder that transforms API DTO
|
|
* into ViewData for the AdminUsersTemplate.
|
|
*
|
|
* Deterministic, side-effect free.
|
|
*/
|
|
export class AdminUsersViewDataBuilder {
|
|
static build(apiDto: UserListResponse): AdminUsersViewData {
|
|
const users = apiDto.users.map(user => ({
|
|
id: user.id,
|
|
email: user.email,
|
|
displayName: user.displayName,
|
|
roles: user.roles,
|
|
status: user.status,
|
|
isSystemAdmin: user.isSystemAdmin,
|
|
createdAt: user.createdAt.toISOString(),
|
|
updatedAt: user.updatedAt.toISOString(),
|
|
lastLoginAt: user.lastLoginAt?.toISOString(),
|
|
primaryDriverId: user.primaryDriverId,
|
|
}));
|
|
|
|
return {
|
|
users,
|
|
total: apiDto.total,
|
|
page: apiDto.page,
|
|
limit: apiDto.limit,
|
|
totalPages: apiDto.totalPages,
|
|
// Pre-computed derived values for template
|
|
activeUserCount: users.filter(u => u.status === 'active').length,
|
|
adminCount: users.filter(u => u.isSystemAdmin).length,
|
|
};
|
|
}
|
|
} |