feat: add verify otp endpoint
This commit is contained in:
@@ -20,7 +20,7 @@ export class AuthController {
|
|||||||
|
|
||||||
@Post('verify-otp')
|
@Post('verify-otp')
|
||||||
@HttpCode(200)
|
@HttpCode(200)
|
||||||
public verifyOTP(@Body() verifyOtpDto: VerifyOtpDTO) {
|
public async verifyOTP(@Body() verifyOtpDto: VerifyOtpDTO) {
|
||||||
return verifyOtpDto;
|
return await this.authService.verifyOTP(verifyOtpDto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { JwtModule } from '@nestjs/jwt';
|
|||||||
import { ConfigService } from '@nestjs/config';
|
import { ConfigService } from '@nestjs/config';
|
||||||
import { LoginProvider } from './providers/login.provider';
|
import { LoginProvider } from './providers/login.provider';
|
||||||
import { GenerateTokenProvider } from './providers/generate-token.provider';
|
import { GenerateTokenProvider } from './providers/generate-token.provider';
|
||||||
|
import { VerifyOTPProvider } from './providers/verify-otp.provider';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
@@ -27,6 +28,11 @@ import { GenerateTokenProvider } from './providers/generate-token.provider';
|
|||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
controllers: [AuthController],
|
controllers: [AuthController],
|
||||||
providers: [AuthService, GenerateTokenProvider, LoginProvider],
|
providers: [
|
||||||
|
AuthService,
|
||||||
|
GenerateTokenProvider,
|
||||||
|
LoginProvider,
|
||||||
|
VerifyOTPProvider,
|
||||||
|
],
|
||||||
})
|
})
|
||||||
export class AuthModule {}
|
export class AuthModule {}
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
POST http://localhost:3000/users/verify-otp
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"phone": "09126093033",
|
||||||
|
"otp": "57903"
|
||||||
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { LoginDTO } from '../dtos/login.dto';
|
import { LoginDTO } from '../dtos/login.dto';
|
||||||
import { LoginProvider } from './login.provider';
|
import { LoginProvider } from './login.provider';
|
||||||
|
import { VerifyOtpDTO } from '../dtos/verify-otp.dto';
|
||||||
|
import { VerifyOTPProvider } from './verify-otp.provider';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AuthService {
|
export class AuthService {
|
||||||
@@ -9,11 +11,18 @@ export class AuthService {
|
|||||||
* Inject Login Provider
|
* Inject Login Provider
|
||||||
*/
|
*/
|
||||||
private readonly loginProvider: LoginProvider,
|
private readonly loginProvider: LoginProvider,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject Verify OTP Provider
|
||||||
|
*/
|
||||||
|
private readonly verifyOTPProvider: VerifyOTPProvider,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public async logIn(loginDto: LoginDTO) {
|
public async logIn(loginDto: LoginDTO) {
|
||||||
return await this.loginProvider.logIn(loginDto);
|
return await this.loginProvider.logIn(loginDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
// public async verifyOTP(verifyOtpDto: VerifyOtpDTO) {}
|
public async verifyOTP(verifyOtpDto: VerifyOtpDTO) {
|
||||||
|
return await this.verifyOTPProvider.verifyOTP(verifyOtpDto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import { Injectable } from '@nestjs/common';
|
||||||
|
import { VerifyOtpDTO } from '../dtos/verify-otp.dto';
|
||||||
|
import { OtpService } from '@/modules/otp/providers/otp.service';
|
||||||
|
import { UsersService } from '@/modules/users/providers/users.service';
|
||||||
|
import { GenerateTokenProvider } from './generate-token.provider';
|
||||||
|
import { randomUUID } from 'crypto';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class VerifyOTPProvider {
|
||||||
|
constructor(
|
||||||
|
/**
|
||||||
|
* Inject OTP Service
|
||||||
|
*/
|
||||||
|
private readonly otpService: OtpService,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject User Service
|
||||||
|
*/
|
||||||
|
private readonly usersService: UsersService,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject Generate Token Provider
|
||||||
|
*/
|
||||||
|
private readonly generateTokenProvider: GenerateTokenProvider,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public async verifyOTP(verifyOtpDto: VerifyOtpDTO) {
|
||||||
|
const { phone, otp } = verifyOtpDto;
|
||||||
|
const otpInstance = await this.otpService.verifyOTP(phone, otp);
|
||||||
|
|
||||||
|
const user = await this.usersService.createOne(otpInstance.phone);
|
||||||
|
|
||||||
|
const jti = randomUUID();
|
||||||
|
return await this.generateTokenProvider.generateTokens(user, jti);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,7 +23,6 @@ export class OTP {
|
|||||||
|
|
||||||
@Column({
|
@Column({
|
||||||
type: 'varchar',
|
type: 'varchar',
|
||||||
length: 5,
|
|
||||||
nullable: false,
|
nullable: false,
|
||||||
})
|
})
|
||||||
code: string;
|
code: string;
|
||||||
|
|||||||
@@ -84,8 +84,9 @@ export class OtpService {
|
|||||||
throw new UnauthorizedException('OTP expired');
|
throw new UnauthorizedException('OTP expired');
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Compared hashed otp
|
const isOTPCorrect = await this.hashingProvider.compare(code, otp.code);
|
||||||
if (otp.code !== code) {
|
|
||||||
|
if (!isOTPCorrect) {
|
||||||
throw new UnauthorizedException('Invalid OTP');
|
throw new UnauthorizedException('Invalid OTP');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user