From a53c0a5b13569542e89593283cdb004aaeab7d2a Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Tue, 18 Nov 2025 14:29:00 +0330 Subject: [PATCH] Refactor AdminAuthController and AuthService to implement admin-specific token refresh functionality; update TokensService to handle refresh token logic with improved transaction management and error handling. --- .../auth/controllers/admin-auth.controller.ts | 2 +- src/modules/auth/services/auth.service.ts | 6 ++- src/modules/auth/services/tokens.service.ts | 50 ++++++++++++++++++- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/modules/auth/controllers/admin-auth.controller.ts b/src/modules/auth/controllers/admin-auth.controller.ts index e43a537..87627c8 100644 --- a/src/modules/auth/controllers/admin-auth.controller.ts +++ b/src/modules/auth/controllers/admin-auth.controller.ts @@ -53,6 +53,6 @@ export class AdminAuthController { @ApiOperation({ summary: 'refresh the user access token / refresh token' }) @Post('refresh') refreshToken(@Body() refreshTokenDto: RefreshTokenDto) { - return this.authService.refreshToken(refreshTokenDto.refreshToken); + return this.authService.refreshTokenAdmin(refreshTokenDto.refreshToken); } } diff --git a/src/modules/auth/services/auth.service.ts b/src/modules/auth/services/auth.service.ts index 5ba9d00..4256856 100644 --- a/src/modules/auth/services/auth.service.ts +++ b/src/modules/auth/services/auth.service.ts @@ -95,7 +95,7 @@ export class AuthService { throw new BadRequestException(RestMessage.NOT_FOUND); } - const tokens = await this.tokensService.generateTokensAdmin(admin, rest); + const tokens = await this.tokensService.generateTokensAdmin(admin.id, rest); const adminResponse = await AdminLoginTransformer.transform(admin, rest); @@ -111,6 +111,10 @@ export class AuthService { return this.tokensService.refreshToken(oldRefreshToken); } + refreshTokenAdmin(oldRefreshToken: string) { + return this.tokensService.refreshTokenAdmin(oldRefreshToken); + } + // async getAdminPerms(adminId: string, restId: string) { // const cachedPerms = await this.cacheService.get(`${this.ADMIN_PERMISSIONS_KEY}:${adminId}:${restId}`); // // eslint-disable-next-line @typescript-eslint/no-unsafe-return diff --git a/src/modules/auth/services/tokens.service.ts b/src/modules/auth/services/tokens.service.ts index df79090..7784958 100755 --- a/src/modules/auth/services/tokens.service.ts +++ b/src/modules/auth/services/tokens.service.ts @@ -36,10 +36,10 @@ export class TokensService { ); } - async generateTokensAdmin(admin: Admin, rest: Restaurant, em?: EntityManager) { + async generateTokensAdmin(adminId: string, rest: Restaurant, em?: EntityManager) { return this.generateAccessAndRefreshTokenAdmin( { - adminId: admin.id, + adminId, restId: rest.id, }, em, @@ -219,6 +219,52 @@ export class TokensService { } } + async refreshTokenAdmin(oldRefreshToken: string) { + const entityManager = this.em.fork(); + + try { + await entityManager.begin(); + console.log('oldRefreshToken', oldRefreshToken); + const token = await entityManager.findOne( + RefreshToken, + { token: oldRefreshToken }, + { + populate: ['restaurant'], + }, + ); + + if (!token) throw new UnauthorizedException(AuthMessage.INVALID_REFRESH_TOKEN); + + // const rest = await this.restRepository.findOne({ id: token.user.id }); + // if (!rest) throw new UnauthorizedException(AuthMessage.INVALID_REFRESH_TOKEN); + + if (dayjs(token.expiresAt).isBefore(dayjs())) { + entityManager.remove(token); + await entityManager.flush(); + await entityManager.commit(); + throw new UnauthorizedException(AuthMessage.REFRESH_TOKEN_EXPIRED); + } + + // Remove the old token + entityManager.remove(token); + + // Generate new tokens within the same transaction + const tokens = await this.generateTokensAdmin(token.ownerId, token.restaurant, entityManager); + + // Commit the transaction + await entityManager.flush(); + await entityManager.commit(); + + return tokens; + } catch (error) { + this.logger.error(error); + if (entityManager.isInTransaction()) { + await entityManager.rollback(); + } + throw error; + } + } + async invalidateRefreshToken(userId: string) { const entityManager = this.em.fork();