Skip to content
This repository has been archived by the owner on Aug 20, 2021. It is now read-only.

Commit

Permalink
Create Confirmation Token On User Creation (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
henriqueleite42 committed Apr 30, 2021
1 parent bea11d6 commit ef7fa6e
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 3 deletions.
13 changes: 12 additions & 1 deletion src/v1/api/user/service/create/local/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { DbHandler } from "v1/utils/db-handler";
import { PasswordUtil } from "v1/utils/password";
import { PinUtil } from "v1/utils/pin";

import { ConfirmationTokenTypeEnum } from "core/enums/confirmation-token-type";
import { ContactTypeEnum } from "core/enums/contact-type";
import { DbErrorEnum } from "core/enums/db-error";

Expand Down Expand Up @@ -42,6 +43,14 @@ export const createLocal = async (

return UserRepository.save({
...userData,
confirmationTokens: [
{
id: v4(),
userId: userData.id,
type: ConfirmationTokenTypeEnum.VERIFY_CONTACT,
token: PinUtil.gen(6),
},
],
contacts: [
{
id: v4(),
Expand All @@ -54,7 +63,9 @@ export const createLocal = async (
})
.then(user => ({
userId: user.id,
verificationCode: user.pin,
username: user.username,
email: user.contacts[0].value,
verificationCode: user.confirmationTokens[0].token,
}))
.catch(
DbHandler([
Expand Down
14 changes: 13 additions & 1 deletion src/v1/api/user/service/create/local/schemas/output.schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,21 @@ export class CreateUserLocalOutputSchema {
})
public userId: string;

@ApiProperty({
description: "username",
example: "foo_bar",
})
public username: string;

@ApiProperty({
description: "User email",
example: "foo@bar.com",
})
public email: string;

@ApiProperty({
description: "Verification Code",
example: PinUtil.gen(),
example: PinUtil.gen(6),
})
public verificationCode: string;
}
14 changes: 13 additions & 1 deletion src/v1/tests/api/user/create/local/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import { v4 } from "uuid";

import { UserService } from "v1/api/user/user.service";

import { ConfirmationTokenTypeEnum } from "core/enums/confirmation-token-type";
import { ContactTypeEnum } from "core/enums/contact-type";
import { DbErrorEnum } from "core/enums/db-error";

import { ConfirmationTokenMock } from "v1/tests/mocks/confirmation-token";
import { ContactMock } from "v1/tests/mocks/contact";
import { UserMock } from "v1/tests/mocks/user";

Expand All @@ -19,6 +21,7 @@ describe("UserService > create > local", () => {

beforeEach(() => {
UserMock.repository.resetMock();
ConfirmationTokenMock.repository.resetMock();
});

it("should be defined", () => {
Expand All @@ -36,9 +39,14 @@ describe("UserService > create > local", () => {
value: "foo@bar.com",
primary: true,
});
const confirmationTokenDoc = ConfirmationTokenMock.doc({
userId: id,
type: ConfirmationTokenTypeEnum.VERIFY_CONTACT,
});

UserMock.repository.save.mockResolvedValue({
...userDoc,
confirmationTokens: [confirmationTokenDoc],
contacts: [contactDoc],
});

Expand All @@ -57,9 +65,13 @@ describe("UserService > create > local", () => {
expect(UserMock.repository.save).toBeCalledTimes(1);
expect(ContactMock.repository.save).toBeCalledTimes(0);
expect(ContactMock.repository.insert).toBeCalledTimes(0);
expect(ConfirmationTokenMock.repository.save).toBeCalledTimes(0);
expect(ConfirmationTokenMock.repository.insert).toBeCalledTimes(0);
expect(result).toStrictEqual({
userId: id,
verificationCode: userDoc.pin,
username: userDoc.username,
email: contactDoc.value,
verificationCode: confirmationTokenDoc.token,
});
});

Expand Down
30 changes: 30 additions & 0 deletions src/v1/tests/mocks/confirmation-token/doc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { v4 } from "uuid";

import { PinUtil } from "v1/utils/pin";

import { ConfirmationTokenTypeEnum } from "core/enums/confirmation-token-type";

export interface CreateConfirmationTokenDoc {
id?: string;
userId: string;
type: ConfirmationTokenTypeEnum;
token?: string;
usedAt?: Date;
createdAt?: Date;
}

export const doc = ({
id,
userId,
type,
token,
usedAt,
createdAt,
}: CreateConfirmationTokenDoc) => ({
userId,
type,
usedAt,
createdAt,
id: id || v4(),
token: token || PinUtil.gen(6),
});
9 changes: 9 additions & 0 deletions src/v1/tests/mocks/confirmation-token/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { makeMockRepository } from "../repository";
import { doc } from "./doc";

const repository = makeMockRepository();

export const ConfirmationTokenMock = {
doc,
repository,
};

0 comments on commit ef7fa6e

Please sign in to comment.