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:
@@ -53,6 +53,6 @@ export class AdminAuthController {
|
|||||||
@ApiOperation({ summary: 'refresh the user access token / refresh token' })
|
@ApiOperation({ summary: 'refresh the user access token / refresh token' })
|
||||||
@Post('refresh')
|
@Post('refresh')
|
||||||
refreshToken(@Body() refreshTokenDto: RefreshTokenDto) {
|
refreshToken(@Body() refreshTokenDto: RefreshTokenDto) {
|
||||||
return this.authService.refreshToken(refreshTokenDto.refreshToken);
|
return this.authService.refreshTokenAdmin(refreshTokenDto.refreshToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ export class AuthService {
|
|||||||
throw new BadRequestException(RestMessage.NOT_FOUND);
|
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);
|
const adminResponse = await AdminLoginTransformer.transform(admin, rest);
|
||||||
|
|
||||||
@@ -111,6 +111,10 @@ export class AuthService {
|
|||||||
return this.tokensService.refreshToken(oldRefreshToken);
|
return this.tokensService.refreshToken(oldRefreshToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
refreshTokenAdmin(oldRefreshToken: string) {
|
||||||
|
return this.tokensService.refreshTokenAdmin(oldRefreshToken);
|
||||||
|
}
|
||||||
|
|
||||||
// async getAdminPerms(adminId: string, restId: string) {
|
// async getAdminPerms(adminId: string, restId: string) {
|
||||||
// const cachedPerms = await this.cacheService.get(`${this.ADMIN_PERMISSIONS_KEY}:${adminId}:${restId}`);
|
// const cachedPerms = await this.cacheService.get(`${this.ADMIN_PERMISSIONS_KEY}:${adminId}:${restId}`);
|
||||||
// // eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
// // eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
||||||
|
|||||||
@@ -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(
|
return this.generateAccessAndRefreshTokenAdmin(
|
||||||
{
|
{
|
||||||
adminId: admin.id,
|
adminId,
|
||||||
restId: rest.id,
|
restId: rest.id,
|
||||||
},
|
},
|
||||||
em,
|
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) {
|
async invalidateRefreshToken(userId: string) {
|
||||||
const entityManager = this.em.fork();
|
const entityManager = this.em.fork();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user