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.

This commit is contained in:
2025-11-18 14:29:00 +03:30
parent 3fc7cccb80
commit a53c0a5b13
3 changed files with 54 additions and 4 deletions
@@ -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);
}
}
+5 -1
View File
@@ -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
+48 -2
View File
@@ -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();