Skip to content

Commit

Permalink
resend_otp: refactored resend otp provider to use phone number.
Browse files Browse the repository at this point in the history
  • Loading branch information
aniebietafia committed Feb 1, 2025
1 parent 76e158a commit c8a2533
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 23 deletions.
9 changes: 6 additions & 3 deletions brints-estate-api/src/users/dto/generate-new-otp.dto.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsEmail, IsNotEmpty } from 'class-validator';
import { IsNotEmpty } from 'class-validator';

export class GenerateNewOTPDto {
@ApiProperty()
@IsNotEmpty()
@IsEmail()
email: string;
country_code: string;

@ApiProperty()
@IsNotEmpty()
phone_number: string;
}
42 changes: 23 additions & 19 deletions brints-estate-api/src/users/providers/resend-otp.provider.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import { AwsSmsService } from 'src/messaging/sms/providers/aws-sms.service';
import { GenerateTokenHelper } from 'src/utils/generate-token.lib';
import { TimeHelper } from 'src/utils/time-helper.lib';
import { ResendOtpProvider } from './resend-otp.provider';
import { MailgunService } from 'src/messaging/email/mailgun-service/providers/mailgun.service';
import { UserHelper } from 'src/utils/userHelper.lib';

describe('ResendOtpProvider', function () {
let provider: ResendOtpProvider;
Expand All @@ -36,6 +38,14 @@ describe('ResendOtpProvider', function () {
sendOTPSms: jest.fn(),
};

const mockMailgunService = {
sendOTP: jest.fn(),
};

const mockUserHelper = {
formatPhoneNumber: jest.fn(),
};

beforeEach(async function () {
const module: TestingModule = await Test.createTestingModule({
providers: [
Expand All @@ -49,6 +59,8 @@ describe('ResendOtpProvider', function () {
{ provide: GenerateTokenHelper, useValue: mockGenerateTokenHelper },
{ provide: AwsSmsService, useValue: mockAwsSmsService },
{ provide: TimeHelper, useValue: mockTimeHelper },
{ provide: UserHelper, useValue: mockUserHelper },
{ provide: MailgunService, useValue: mockMailgunService },
],
}).compile();

Expand All @@ -70,23 +82,10 @@ describe('ResendOtpProvider', function () {
user_auth: { id: '1' },
};

// it('should find user by email', async () => {
// const generateNewOTPDto: GenerateNewOTPDto = {
// email: 'example@test.com',
// };

// mockUserRepository.findOne.mockResolvedValue(mockUser);
// await provider.resendOTP(generateNewOTPDto);

// expect(mockUserRepository.findOne).toHaveBeenCalledWith({
// where: { email: generateNewOTPDto.email },
// relations: { user_auth: true },
// });
// });

it('should throw if user does not exist', async () => {
const generateNewOTPDto: GenerateNewOTPDto = {
email: 'example@test.com',
country_code: '234',
phone_number: '08021234567',
};

mockUserRepository.findOne.mockResolvedValue(null);
Expand All @@ -98,7 +97,8 @@ describe('ResendOtpProvider', function () {

it('should throw if user auth does not exist', async () => {
const generateNewOTPDto: GenerateNewOTPDto = {
email: 'example@test.com',
country_code: '234',
phone_number: '08021234567',
};

mockUserRepository.findOne.mockResolvedValue(mockUser);
Expand All @@ -114,7 +114,8 @@ describe('ResendOtpProvider', function () {

it('should generate OTP and set expiry date', async () => {
const generateNewOTPDto: GenerateNewOTPDto = {
email: 'example@test.com',
country_code: '234',
phone_number: '08021234567',
};

mockUserRepository.findOne.mockResolvedValue(mockUser);
Expand All @@ -130,7 +131,8 @@ describe('ResendOtpProvider', function () {

it('should save user auth', async () => {
const generateNewOTPDto: GenerateNewOTPDto = {
email: 'example@test.com',
country_code: '234',
phone_number: '08021234567',
};

mockUserRepository.findOne.mockResolvedValue(mockUser);
Expand All @@ -146,7 +148,8 @@ describe('ResendOtpProvider', function () {

it('should send OTP SMS', async () => {
const generateNewOTPDto: GenerateNewOTPDto = {
email: 'example@test.com',
country_code: '234',
phone_number: '08021234567',
};

mockUserRepository.findOne.mockResolvedValue(mockUser);
Expand All @@ -157,6 +160,7 @@ describe('ResendOtpProvider', function () {
await provider.resendOTP(generateNewOTPDto);

expect(mockAwsSmsService.sendOTPSms).toHaveBeenCalled();
expect(mockMailgunService.sendOTP).toHaveBeenCalled();
});
});
});
14 changes: 13 additions & 1 deletion brints-estate-api/src/users/providers/resend-otp.provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import { CustomException } from '../../exceptions/custom.exception';
import { VerificationStatus } from '../../enums/status.enum';
import { AwsSmsService } from 'src/messaging/sms/providers/aws-sms.service';
import { TimeHelper } from 'src/utils/time-helper.lib';
import { UserHelper } from 'src/utils/userHelper.lib';
import { MailgunService } from 'src/messaging/email/mailgun-service/providers/mailgun.service';

@Injectable()
export class ResendOtpProvider {
Expand All @@ -25,11 +27,20 @@ export class ResendOtpProvider {
private readonly awsSmsService: AwsSmsService,

private readonly timeHelper: TimeHelper,

private readonly userHelper: UserHelper,

private readonly mailgunService: MailgunService,
) {}

public async resendOTP(generateNewOTPDto: GenerateNewOTPDto): Promise<void> {
const extractedPhoneNumber = this.userHelper.formatPhoneNumber(
generateNewOTPDto.country_code,
generateNewOTPDto.phone_number,
);

const user = await this.userRepository.findOne({
where: { email: generateNewOTPDto.email },
where: { phone_number: extractedPhoneNumber },
relations: { user_auth: true },
});

Expand All @@ -56,5 +67,6 @@ export class ResendOtpProvider {
await this.userRepository.save(user);

await this.awsSmsService.sendOTPSms(user, userAuth);
await this.mailgunService.sendOTP(user, userAuth);
}
}

0 comments on commit c8a2533

Please sign in to comment.