import { Body, Controller, HttpCode, HttpStatus, Post, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Request } from 'express'; import { AuthenticatedUser, Public } from '~/common/decorators'; import { AccessTokenGuard } from '~/common/guards'; import { ApiDataResponse, ApiLangRequestHeader } from '~/core/decorators'; import { ResponseFactory } from '~/core/utils'; import { ChangePasswordRequestDto, CreateUnverifiedUserRequestDto, ForgetPasswordRequestDto, JuniorLoginRequestDto, LoginRequestDto, RefreshTokenRequestDto, SendForgetPasswordOtpRequestDto, setJuniorPasswordRequestDto, VerifyForgetPasswordOtpRequestDto, VerifyUserRequestDto, } from '../dtos/request'; import { SendForgetPasswordOtpResponseDto, SendRegisterOtpResponseDto } from '../dtos/response'; import { LoginResponseDto } from '../dtos/response/login.response.dto'; import { VerifyForgetPasswordOtpResponseDto } from '../dtos/response/verify-forget-password-otp.response.dto'; import { IJwtPayload } from '../interfaces'; import { AuthService } from '../services'; @Controller('auth') @ApiTags('Auth') @ApiBearerAuth() @ApiLangRequestHeader() export class AuthController { constructor(private readonly authService: AuthService) {} @Post('register/otp') async register(@Body() createUnverifiedUserDto: CreateUnverifiedUserRequestDto) { const phoneNumber = await this.authService.sendRegisterOtp(createUnverifiedUserDto); return ResponseFactory.data(new SendRegisterOtpResponseDto(phoneNumber)); } @Post('register/verify') async verifyUser(@Body() verifyUserDto: VerifyUserRequestDto) { const [res, user] = await this.authService.verifyUser(verifyUserDto); return ResponseFactory.data(new LoginResponseDto(res, user)); } @Post('login') async login(@Body() verifyUserDto: LoginRequestDto) { const [res, user] = await this.authService.loginWithPassword(verifyUserDto); return ResponseFactory.data(new LoginResponseDto(res, user)); } @Post('forget-password/otp') async forgetPassword(@Body() sendForgetPasswordOtpDto: SendForgetPasswordOtpRequestDto) { const maskedNumber = await this.authService.sendForgetPasswordOtp(sendForgetPasswordOtpDto); return ResponseFactory.data(new SendForgetPasswordOtpResponseDto(maskedNumber)); } @Post('forget-password/verify') @HttpCode(HttpStatus.OK) @ApiDataResponse(VerifyForgetPasswordOtpResponseDto) async verifyForgetPasswordOtp(@Body() forgetPasswordDto: VerifyForgetPasswordOtpRequestDto) { const { token, user } = await this.authService.verifyForgetPasswordOtp(forgetPasswordDto); return ResponseFactory.data(new VerifyForgetPasswordOtpResponseDto(token, user)); } @Post('forget-password/reset') @HttpCode(HttpStatus.NO_CONTENT) resetPassword(@Body() forgetPasswordDto: ForgetPasswordRequestDto) { return this.authService.resetPassword(forgetPasswordDto); } @Post('change-password') @HttpCode(HttpStatus.NO_CONTENT) @UseGuards(AccessTokenGuard) changePassword(@AuthenticatedUser() { sub }: IJwtPayload, @Body() forgetPasswordDto: ChangePasswordRequestDto) { return this.authService.changePassword(sub, forgetPasswordDto); } @Post('junior/set-password') @HttpCode(HttpStatus.NO_CONTENT) @Public() setJuniorPasscode(@Body() setPassworddto: setJuniorPasswordRequestDto) { return this.authService.setJuniorPassword(setPassworddto); } @Post('junior/login') @HttpCode(HttpStatus.OK) @ApiDataResponse(LoginResponseDto) async juniorLogin(@Body() juniorLoginDto: JuniorLoginRequestDto) { const [res, user] = await this.authService.juniorLogin(juniorLoginDto); return ResponseFactory.data(new LoginResponseDto(res, user)); } @Post('refresh-token') @Public() async refreshToken(@Body() { refreshToken }: RefreshTokenRequestDto) { const [res, user] = await this.authService.refreshToken(refreshToken); return ResponseFactory.data(new LoginResponseDto(res, user)); } @Post('logout') @HttpCode(HttpStatus.NO_CONTENT) @UseGuards(AccessTokenGuard) async logout(@Req() request: Request) { await this.authService.logout(request); } }