mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-08-26 06:09:41 +00:00
feat: handle new registration flow
This commit is contained in:
@ -45,62 +45,45 @@ export class AuthService {
|
||||
private readonly cacheService: CacheService,
|
||||
private readonly oauth2Service: Oauth2Service,
|
||||
) {}
|
||||
async sendRegisterOtp({ phoneNumber, countryCode }: CreateUnverifiedUserRequestDto) {
|
||||
this.logger.log(`Sending OTP to ${countryCode + phoneNumber}`);
|
||||
const user = await this.userService.findOrCreateUser({ phoneNumber, countryCode });
|
||||
async sendRegisterOtp(body: CreateUnverifiedUserRequestDto) {
|
||||
this.logger.log(`Sending OTP to ${body.email}`);
|
||||
const user = await this.userService.findOrCreateUser(body);
|
||||
|
||||
return this.otpService.generateAndSendOtp({
|
||||
userId: user.id,
|
||||
recipient: user.countryCode + user.phoneNumber,
|
||||
scope: OtpScope.VERIFY_PHONE,
|
||||
otpType: OtpType.SMS,
|
||||
recipient: user.email,
|
||||
scope: OtpScope.VERIFY_EMAIL,
|
||||
otpType: OtpType.EMAIL,
|
||||
});
|
||||
}
|
||||
|
||||
async verifyUser(verifyUserDto: VerifyUserRequestDto): Promise<[ILoginResponse, User]> {
|
||||
this.logger.log(`Verifying user with phone number ${verifyUserDto.countryCode + verifyUserDto.phoneNumber}`);
|
||||
const user = await this.userService.findUserOrThrow({ phoneNumber: verifyUserDto.phoneNumber });
|
||||
this.logger.log(`Verifying user with email ${verifyUserDto.email}`);
|
||||
const user = await this.userService.findUserOrThrow({ email: verifyUserDto.email });
|
||||
|
||||
if (user.isProfileCompleted) {
|
||||
this.logger.error(
|
||||
`User with phone number ${verifyUserDto.countryCode + verifyUserDto.phoneNumber} already verified`,
|
||||
);
|
||||
throw new BadRequestException('USER.PHONE_ALREADY_VERIFIED');
|
||||
if (user.isEmailVerified) {
|
||||
this.logger.error(`User with email ${verifyUserDto.email} already verified`);
|
||||
throw new BadRequestException('USER.EMAIL_ALREADY_VERIFIED');
|
||||
}
|
||||
|
||||
const isOtpValid = await this.otpService.verifyOtp({
|
||||
userId: user.id,
|
||||
scope: OtpScope.VERIFY_PHONE,
|
||||
otpType: OtpType.SMS,
|
||||
scope: OtpScope.VERIFY_EMAIL,
|
||||
otpType: OtpType.EMAIL,
|
||||
value: verifyUserDto.otp,
|
||||
});
|
||||
|
||||
if (!isOtpValid) {
|
||||
this.logger.error(
|
||||
`Invalid OTP for user with phone number ${verifyUserDto.countryCode + verifyUserDto.phoneNumber}`,
|
||||
);
|
||||
this.logger.error(`Invalid OTP for user with email ${verifyUserDto.email}`);
|
||||
throw new BadRequestException('OTP.INVALID_OTP');
|
||||
}
|
||||
|
||||
if (user.isPhoneVerified) {
|
||||
this.logger.log(
|
||||
`User with phone number ${
|
||||
verifyUserDto.countryCode + verifyUserDto.phoneNumber
|
||||
} already verified but did not complete registration process`,
|
||||
);
|
||||
|
||||
const tokens = await this.generateAuthToken(user);
|
||||
return [tokens, user];
|
||||
}
|
||||
|
||||
await this.userService.verifyPhoneNumber(user.id);
|
||||
await this.userService.verifyUser(user.id, verifyUserDto);
|
||||
|
||||
await user.reload();
|
||||
|
||||
const tokens = await this.generateAuthToken(user);
|
||||
this.logger.log(
|
||||
`User with phone number ${verifyUserDto.countryCode + verifyUserDto.phoneNumber} verified successfully`,
|
||||
);
|
||||
this.logger.log(`User with email ${verifyUserDto.email} verified successfully`);
|
||||
return [tokens, user];
|
||||
}
|
||||
|
||||
@ -138,46 +121,46 @@ export class AuthService {
|
||||
this.logger.log(`Passcode set successfully for user with id ${userId}`);
|
||||
}
|
||||
|
||||
async setPhoneNumber(userId: string, { phoneNumber, countryCode }: CreateUnverifiedUserRequestDto) {
|
||||
const user = await this.userService.findUserOrThrow({ id: userId });
|
||||
// async setPhoneNumber(userId: string, { phoneNumber, countryCode }: CreateUnverifiedUserRequestDto) {
|
||||
// const user = await this.userService.findUserOrThrow({ id: userId });
|
||||
|
||||
if (user.phoneNumber || user.countryCode) {
|
||||
this.logger.error(`Phone number already set for user with id ${userId}`);
|
||||
throw new BadRequestException('USER.PHONE_NUMBER_ALREADY_SET');
|
||||
}
|
||||
// if (user.phoneNumber || user.countryCode) {
|
||||
// this.logger.error(`Phone number already set for user with id ${userId}`);
|
||||
// throw new BadRequestException('USER.PHONE_NUMBER_ALREADY_SET');
|
||||
// }
|
||||
|
||||
const existingUser = await this.userService.findUser({ phoneNumber, countryCode });
|
||||
// const existingUser = await this.userService.findUser({ phoneNumber, countryCode });
|
||||
|
||||
if (existingUser) {
|
||||
this.logger.error(`Phone number ${countryCode + phoneNumber} already taken`);
|
||||
throw new BadRequestException('USER.PHONE_NUMBER_ALREADY_TAKEN');
|
||||
}
|
||||
// if (existingUser) {
|
||||
// this.logger.error(`Phone number ${countryCode + phoneNumber} already taken`);
|
||||
// throw new BadRequestException('USER.PHONE_NUMBER_ALREADY_TAKEN');
|
||||
// }
|
||||
|
||||
await this.userService.setPhoneNumber(userId, phoneNumber, countryCode);
|
||||
// await this.userService.setPhoneNumber(userId, phoneNumber, countryCode);
|
||||
|
||||
return this.otpService.generateAndSendOtp({
|
||||
userId,
|
||||
recipient: countryCode + phoneNumber,
|
||||
scope: OtpScope.VERIFY_PHONE,
|
||||
otpType: OtpType.SMS,
|
||||
});
|
||||
}
|
||||
// return this.otpService.generateAndSendOtp({
|
||||
// userId,
|
||||
// recipient: countryCode + phoneNumber,
|
||||
// scope: OtpScope.VERIFY_PHONE,
|
||||
// otpType: OtpType.SMS,
|
||||
// });
|
||||
// }
|
||||
|
||||
async verifyPhoneNumber(userId: string, otp: string) {
|
||||
const isOtpValid = await this.otpService.verifyOtp({
|
||||
otpType: OtpType.SMS,
|
||||
scope: OtpScope.VERIFY_PHONE,
|
||||
userId,
|
||||
value: otp,
|
||||
});
|
||||
// async verifyPhoneNumber(userId: string, otp: string) {
|
||||
// const isOtpValid = await this.otpService.verifyOtp({
|
||||
// otpType: OtpType.SMS,
|
||||
// scope: OtpScope.VERIFY_PHONE,
|
||||
// userId,
|
||||
// value: otp,
|
||||
// });
|
||||
|
||||
if (!isOtpValid) {
|
||||
this.logger.error(`Invalid OTP for user with id ${userId}`);
|
||||
throw new BadRequestException('OTP.INVALID_OTP');
|
||||
}
|
||||
// if (!isOtpValid) {
|
||||
// this.logger.error(`Invalid OTP for user with id ${userId}`);
|
||||
// throw new BadRequestException('OTP.INVALID_OTP');
|
||||
// }
|
||||
|
||||
return this.userService.verifyPhoneNumber(userId);
|
||||
}
|
||||
// return this.userService.verifyPhoneNumber(userId);
|
||||
// }
|
||||
|
||||
async enableBiometric(userId: string, { deviceId, publicKey }: EnableBiometricRequestDto) {
|
||||
this.logger.log(`Enabling biometric for user with id ${userId}`);
|
||||
@ -330,7 +313,8 @@ export class AuthService {
|
||||
}
|
||||
|
||||
async sendLoginOtp({ email }: SendLoginOtpRequestDto) {
|
||||
const user = await this.userService.findOrCreateByEmail(email);
|
||||
const user = await this.userService.findUserOrThrow({ email });
|
||||
|
||||
this.logger.log(`Sending login OTP to ${email}`);
|
||||
return this.otpService.generateAndSendOtp({
|
||||
recipient: email,
|
||||
|
Reference in New Issue
Block a user