From d957b3deed69b0639f8c30b3dedadcfc1f768ff8 Mon Sep 17 00:00:00 2001 From: Andres Pinto Date: Mon, 21 Apr 2025 11:13:26 -0400 Subject: [PATCH] feat(refresh-token): added user to refresh token endpoint --- .../user/dto/responses/refresh-token.dto.ts | 59 +++++++++++++++++++ src/modules/user/user.controller.spec.ts | 5 +- src/modules/user/user.controller.ts | 37 +++++++++++- src/modules/user/user.usecase.ts | 2 +- 4 files changed, 99 insertions(+), 4 deletions(-) diff --git a/src/modules/user/dto/responses/refresh-token.dto.ts b/src/modules/user/dto/responses/refresh-token.dto.ts index 0db9b71d0..de7249a8a 100644 --- a/src/modules/user/dto/responses/refresh-token.dto.ts +++ b/src/modules/user/dto/responses/refresh-token.dto.ts @@ -1,5 +1,58 @@ import { ApiProperty } from '@nestjs/swagger'; +export class RefreshTokenUserResponseDto { + @ApiProperty() + email: string; + + @ApiProperty() + userId: string; + + @ApiProperty() + mnemonic: string; + + @ApiProperty() + root_folder_id: number; + + @ApiProperty() + rootFolderId: string; + + @ApiProperty() + name: string; + + @ApiProperty() + lastname: string; + + @ApiProperty() + uuid: string; + + @ApiProperty() + credit: number; + + @ApiProperty() + createdAt: Date; + + @ApiProperty() + registerCompleted: boolean; + + @ApiProperty() + username: string; + + @ApiProperty() + bridgeUser: string; + + @ApiProperty() + backupsBucket: string; + + @ApiProperty() + avatar: string; + + @ApiProperty() + emailVerified: boolean; + + @ApiProperty() + lastPasswordChangedAt: Date; +} + export class RefreshTokenResponseDto { @ApiProperty({ description: 'The old token that has been replaced', @@ -12,4 +65,10 @@ export class RefreshTokenResponseDto { example: 'oldToken1234567890', }) newToken: string; + + @ApiProperty({ + description: 'User information', + type: RefreshTokenUserResponseDto, + }) + user: RefreshTokenUserResponseDto; } diff --git a/src/modules/user/user.controller.spec.ts b/src/modules/user/user.controller.spec.ts index b0f6ee6f8..8ca9b1bab 100644 --- a/src/modules/user/user.controller.spec.ts +++ b/src/modules/user/user.controller.spec.ts @@ -554,7 +554,10 @@ describe('User Controller', () => { }); const eccKey = newKeyServer(); - const mockTokens = { token: 'mockToken', newToken: 'mockNewToken' }; + const mockTokens = { + token: 'mockToken', + newToken: 'mockNewToken', + }; cryptoService.decryptText .mockReturnValueOnce(mockUser.password) // currentPassword .mockReturnValueOnce(newPassword) diff --git a/src/modules/user/user.controller.ts b/src/modules/user/user.controller.ts index 383b20879..bc5b1c909 100644 --- a/src/modules/user/user.controller.ts +++ b/src/modules/user/user.controller.ts @@ -438,8 +438,41 @@ export class UserController { description: 'Returns a new token', type: RefreshTokenResponseDto, }) - refreshToken(@UserDecorator() user: User): Promise { - return this.userUseCases.getAuthTokens(user); + async refreshToken( + @UserDecorator() user: User, + ): Promise { + const tokens = await this.userUseCases.getAuthTokens(user); + + const [avatar, rootFolder] = await Promise.all([ + user.avatar ? this.userUseCases.getAvatarUrl(user.avatar) : null, + this.userUseCases.getOrCreateUserRootFolderAndBucket(user), + ]); + + const userData = { + email: user.email, + userId: user.userId, + mnemonic: user.mnemonic.toString(), + root_folder_id: rootFolder?.id, + rootFolderId: rootFolder?.uuid, + name: user.name, + lastname: user.lastname, + uuid: user.uuid, + credit: user.credit, + createdAt: user.createdAt, + registerCompleted: user.registerCompleted, + teams: false, + username: user.username, + bridgeUser: user.bridgeUser, + sharedWorkspace: user.sharedWorkspace, + appSumoDetails: null, + hasReferralsProgram: false, + backupsBucket: user.backupsBucket, + avatar, + emailVerified: user.emailVerified, + lastPasswordChangedAt: user.lastPasswordChangedAt, + }; + + return { ...tokens, user: userData }; } @Patch('password') diff --git a/src/modules/user/user.usecase.ts b/src/modules/user/user.usecase.ts index c9f69f82c..331916a6e 100644 --- a/src/modules/user/user.usecase.ts +++ b/src/modules/user/user.usecase.ts @@ -811,7 +811,7 @@ export class UserUseCases { async getAuthTokens( user: User, customIat?: number, - ): Promise { + ): Promise<{ token: string; newToken: string }> { const availableWorkspaces = await this.workspaceRepository.findUserAvailableWorkspaces(user.uuid);