From 2b4f4ce1b8cecf3353562955ea02ebaf14d3ed1d Mon Sep 17 00:00:00 2001 From: diallolatoile Date: Mon, 10 Nov 2025 20:41:25 +0000 Subject: [PATCH] feat: add DCB User Service API - Authentication system with KEYCLOAK - Modular architecture with services for each feature --- .../controllers/hub-users.controller.ts | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/hub-users/controllers/hub-users.controller.ts b/src/hub-users/controllers/hub-users.controller.ts index 42ed783..925c86e 100644 --- a/src/hub-users/controllers/hub-users.controller.ts +++ b/src/hub-users/controllers/hub-users.controller.ts @@ -192,6 +192,53 @@ export class HubUserResponse { lastLogin?: number; } +export class MerchantUserResponse { + @ApiProperty({ description: 'User ID' }) + id: string; + + @ApiProperty({ description: 'Username' }) + username: string; + + @ApiProperty({ description: 'Email address' }) + email: string; + + @ApiProperty({ description: 'First name' }) + firstName: string; + + @ApiProperty({ description: 'Last name' }) + lastName: string; + + @ApiProperty({ + enum: [UserRole.DCB_ADMIN, UserRole.DCB_SUPPORT, UserRole.DCB_PARTNER, UserRole.DCB_PARTNER_ADMIN, UserRole.DCB_PARTNER_MANAGER, UserRole.DCB_PARTNER_SUPPORT], + description: 'User role' + }) + role: UserRole; + + @ApiProperty({ description: 'Whether the user is enabled' }) + enabled: boolean; + + @ApiProperty({ description: 'Whether the email is verified' }) + emailVerified: boolean; + + @ApiProperty({ required: false, description: 'Merchant partner ID' }) + merchantPartnerId?: string; + + @ApiProperty({ description: 'User creator ID' }) + createdBy: string; + + @ApiProperty({ description: 'User creator username' }) + createdByUsername: string; + + @ApiProperty({ enum: ['HUB', 'MERCHANT'], description: 'User type' }) + userType: 'HUB' | 'MERCHANT'; + + @ApiProperty({ description: 'Creation timestamp' }) + createdTimestamp: number; + + @ApiProperty({ required: false, description: 'Last login timestamp' }) + lastLogin?: number; +} + export class HubUserProfileResponse { @ApiProperty({ description: 'User ID' }) id: string; @@ -252,6 +299,26 @@ function mapToHubUserResponse(user: User): HubUserResponse { }; } +// Mapper functions +function mapToMerchantUserResponse(user: User): MerchantUserResponse { + return { + id: user.id, + username: user.username, + email: user.email, + firstName: user.firstName, + lastName: user.lastName, + role: user.role, + enabled: user.enabled, + emailVerified: user.emailVerified, + merchantPartnerId: user.merchantPartnerId, + createdBy: user.createdBy, + createdByUsername: user.createdByUsername, + userType: user.userType, + createdTimestamp: user.createdTimestamp, + lastLogin: user.lastLogin, + }; +} + function mapToHubUserProfileResponse(profile: any): HubUserProfileResponse { return { id: profile.id, @@ -413,7 +480,7 @@ export class HubUsersController { return { hubUsers: hubUsers.map(mapToHubUserResponse), - merchantUsers: merchantUsers.map(mapToHubUserResponse), + merchantUsers: merchantUsers.map(mapToMerchantUserResponse), statistics: { totalHubUsers: hubUsers.length, totalMerchantUsers: merchantUsers.length,