58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
import {
|
|
CanActivate,
|
|
ExecutionContext,
|
|
Injectable,
|
|
UnprocessableEntityException,
|
|
} from '@nestjs/common';
|
|
import { InjectDataSource } from '@nestjs/typeorm';
|
|
import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants';
|
|
import { OtpVerificationModel } from 'src/modules/configuration/otp-verification/data/models/otp-verification.model';
|
|
import { OtpVerificationEntity } from 'src/modules/configuration/otp-verification/domain/entities/otp-verification.entity';
|
|
import { DataSource } from 'typeorm';
|
|
|
|
@Injectable()
|
|
export class OtpCheckerGuard implements CanActivate {
|
|
constructor(
|
|
@InjectDataSource(CONNECTION_NAME.DEFAULT)
|
|
protected readonly dataSource: DataSource,
|
|
) {}
|
|
|
|
get otpRepository() {
|
|
return this.dataSource.getRepository(OtpVerificationModel);
|
|
}
|
|
|
|
async canActivate(context: ExecutionContext): Promise<boolean> {
|
|
const request = context.switchToHttp().getRequest();
|
|
const verificationCode = request.headers['x-verification-code'];
|
|
console.log({ verificationCode });
|
|
|
|
if (verificationCode) {
|
|
const decoded = Buffer.from(verificationCode, 'base64').toString('ascii');
|
|
const [dataIdentity, otpCode] = decoded.split('|');
|
|
|
|
let otpData: OtpVerificationEntity;
|
|
|
|
otpData = await this.otpRepository.findOne({
|
|
where: {
|
|
otp_code: otpCode,
|
|
target_id: dataIdentity,
|
|
},
|
|
});
|
|
|
|
if (!otpData) {
|
|
otpData = await this.otpRepository.findOne({
|
|
where: {
|
|
otp_code: otpCode,
|
|
reference: dataIdentity,
|
|
},
|
|
});
|
|
}
|
|
|
|
// console.log({ dataIdentity, otpCode, otpData });
|
|
if (otpData && otpData?.verified_at) return true;
|
|
}
|
|
|
|
throw new UnprocessableEntityException('OTP not verified.');
|
|
}
|
|
}
|