From 8497a5779da7f3adad74cbdd9dd8b817edde6631 Mon Sep 17 00:00:00 2001 From: Firman Ramdhani <33869609+firmanramdhani@users.noreply.github.com> Date: Tue, 10 Jun 2025 15:02:43 +0700 Subject: [PATCH] feat: fix validation generate otp --- src/core/helpers/otp/otp-service.ts | 8 +++++-- .../data/services/otp-verification.service.ts | 22 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/core/helpers/otp/otp-service.ts b/src/core/helpers/otp/otp-service.ts index 9b0e33e..0ba5e26 100644 --- a/src/core/helpers/otp/otp-service.ts +++ b/src/core/helpers/otp/otp-service.ts @@ -38,6 +38,10 @@ export class OtpService { return Object.values(counts).some((count) => count > 2); } + private hasMatchLength(str: string) { + return str.length !== this.otpLength; + } + public generateSecureOTP(): string { let otp: string; @@ -46,11 +50,11 @@ export class OtpService { Math.floor(Math.random() * 10).toString(), ).join(''); } while ( + this.hasMatchLength(otp) || this.hasSequentialDigits(otp) || this.hasRepeatedDigits(otp) || this.isPalindrome(otp) || - this.hasPartiallyRepeatedDigits(otp) || - otp?.length < this.otpLength + this.hasPartiallyRepeatedDigits(otp) ); return otp; } diff --git a/src/modules/configuration/otp-verification/data/services/otp-verification.service.ts b/src/modules/configuration/otp-verification/data/services/otp-verification.service.ts index 11420d2..148325e 100644 --- a/src/modules/configuration/otp-verification/data/services/otp-verification.service.ts +++ b/src/modules/configuration/otp-verification/data/services/otp-verification.service.ts @@ -74,7 +74,9 @@ export class OtpVerificationService { const createdAtMoment = moment(Number(activeOTP.created_at)); const nowMoment = moment(Number(dateNow)); const diffSeconds = nowMoment.diff(createdAtMoment, 'seconds'); - if (diffSeconds < 60) { + const isProduction = process.env.NODE_ENV === 'true'; + + if (diffSeconds < 60 && isProduction) { throw new BadRequestException( 'An active OTP request was made recently. Please try again later.', ); @@ -116,10 +118,13 @@ export class OtpVerificationService { ); } + let otp: any; + // Build a where condition with OR between target_id and reference - const otp = await this.otpVerificationRepo.findOne({ - where: [ - { + + if (target_id) { + otp = await this.otpVerificationRepo.findOne({ + where: { otp_code, action_type, target_id, @@ -127,7 +132,10 @@ export class OtpVerificationService { is_used: false, is_replaced: false, }, - { + }); + } else if (reference) { + otp = await this.otpVerificationRepo.findOne({ + where: { otp_code, action_type, reference, @@ -135,8 +143,8 @@ export class OtpVerificationService { is_used: false, is_replaced: false, }, - ], - }); + }); + } if (!otp) { throw new BadRequestException('Invalid or expired OTP.');