diff --git a/src/admin/admin.controller.ts b/src/admin/admin.controller.ts index a79a2d8..fbffe14 100644 --- a/src/admin/admin.controller.ts +++ b/src/admin/admin.controller.ts @@ -10,14 +10,21 @@ export class AdminController { constructor(private readonly adminService: AdminService) {} // register as a admin @Post("register") - async register(@Body() createAdminDto: CreateAdminDto): Promise<{message}> { + async register(@Body() createAdminDto: CreateAdminDto): Promise<{ message }> { return this.adminService.register(createAdminDto); } //login as admin @Post("login") - async login(@Body() loginAdminDto: LoginAdminDto): Promise<{ accessToken, refreshToken }> { + async login(@Body() loginAdminDto: LoginAdminDto): Promise<{ accessToken; refreshToken }> { return this.adminService.login(loginAdminDto); } + //logout user + @UseGuards(RoleGuard) + @Get("logout") + async logout(@Request() req) { + const userId = req.user.id; + return this.adminService.logout(userId); + } //get a new access token @Post("new-token") async newAccessToken(@Body("refreshToken") refreshToken: string) { @@ -26,7 +33,7 @@ export class AdminController { //edit admin profile @UseGuards(RoleGuard) @Put() - async editAdminProfile(@Request() req, @Body() updateAdminDto: UpdateUserDto): Promise<{message}>{ + async editAdminProfile(@Request() req, @Body() updateAdminDto: UpdateUserDto): Promise<{ message }> { const userId = req.user.id; return this.adminService.editAdminProfile(userId, updateAdminDto); } diff --git a/src/admin/admin.service.ts b/src/admin/admin.service.ts index f066479..8b390c6 100644 --- a/src/admin/admin.service.ts +++ b/src/admin/admin.service.ts @@ -64,6 +64,10 @@ export class AdminService { expiresIn: this.configService.get("JWT_REFRESH_EXPIRES") || "7d", }, ); + await this.adminModel.update( + { refreshToken }, // + { where: { id: admin.id } }, + ); return { accessToken, refreshToken }; } catch (error) { @@ -73,6 +77,17 @@ export class AdminService { throw new HttpException("An unexpected error occurred. Please try again later.", HttpStatus.INTERNAL_SERVER_ERROR); } } + //logout (delete refresh token from database) + async logout(userId: number) { + const user = await this.adminModel.findOne({ + where: { id: userId }, + }); + if (!user) { + throw new HttpException("User not found.", HttpStatus.NOT_FOUND); + } + await this.adminModel.update({ refreshToken: null }, { where: { id: userId } }); + return { message: "logout is successful" }; + } //getting new access token async newAccessToken(refreshToken: string) { if (!refreshToken) { diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index b0dd800..0e77bc0 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -25,7 +25,13 @@ export class UsersController { async newAccessToken(@Body("refreshToken") refreshToken: string) { return this.usersService.newAccessToken(refreshToken); } - + //logout user + @UseGuards(JwtAuthGuard) + @Get('logout') + async logout(@Request() req) { + const userId = req.user.id; + return this.usersService.logout(userId); + } //retrieve a user information @UseGuards(JwtAuthGuard) @Get() diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 558f9ce..da76aff 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -110,6 +110,17 @@ export class UsersService { return { accessToken }; } + //logout (delete refresh token from database) + async logout(userId: number) { + const user = await this.userModel.findOne({ + where: { id: userId }, + }); + if (!user) { + throw new HttpException("User not found.", HttpStatus.NOT_FOUND); + } + await this.userModel.update({ refreshToken: null }, { where: { id: userId } }); + return{message:"logout is successful"} + } //get information user method async getProfile(userId: number): Promise { try {