Skip to content
This repository was archived by the owner on Mar 20, 2023. It is now read-only.

Commit e1801d7

Browse files
authored
feat(api): [write | emailConfirmation] rest API endpoint for ApproveEmailConfirmation (#287) (#367)
1 parent 7979932 commit e1801d7

File tree

7 files changed

+60
-8
lines changed

7 files changed

+60
-8
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
# email-confirmation.rest-controller.ts
22

33
@confirmationFor = 'user-registration'
4+
@confirmationToken = 'SomeConfirmationToken'
45

56
# Request email-confirmation for user
67
POST {{serverUrl}}/email-confirmation
78

89
{
910
"confirmationFor": "{{confirmationFor}}"
1011
}
12+
13+
###
14+
15+
# Approve email-confirmation for user
16+
POST {{serverUrl}}/email-confirmation/Approval
17+
18+
{
19+
"confirmationToken": "{{confirmationToken}}"
20+
}

packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ describe('Approve email confirmation', () => {
8787

8888
// when - them
8989
expect(() => approveEmailConfirmation(emailConfirmationWithOldToken)(pastEvents)).toThrow(
90-
'An attempt was made on obsolete token',
90+
'An attempt was made on obsolete confirmation token',
9191
);
9292
});
9393

packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const approveEmailConfirmation =
1414
throw new Error('Email confirmation has been already approved');
1515

1616
if (lastPublishedEmailConfirmation.data.confirmationToken !== command.data.confirmationToken)
17-
throw new Error('An attempt was made on obsolete token');
17+
throw new Error('An attempt was made on obsolete confirmation token');
1818

1919
return [emailConfirmationWasApprovedEvent(command.data)];
2020
};

packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
import { Body, Controller, HttpCode, Post, UseGuards } from '@nestjs/common';
22
import { CommandBus } from '@nestjs/cqrs';
33

4-
import { EmailConfirmationBody } from '@coderscamp/shared/models/email-confirmation';
4+
import {
5+
APPROVE_ENDPOINT,
6+
ApproveEmailConfirmationBody,
7+
} from '@coderscamp/shared/models/email-confirmation/approve-email-confirmation';
8+
import { RequestEmailConfirmationBody } from '@coderscamp/shared/models/email-confirmation/request-email-confirmation';
59

610
import { JwtUserId } from '@/crud/auth/jwt/jwt-user-id.decorator';
11+
import {
12+
ApproveEmailConfirmationApplicationCommand,
13+
approveEmailConfirmationCommand,
14+
} from '@/module/commands/approve-email-confirmation';
715
import {
816
RequestEmailConfirmationApplicationCommand,
917
requestEmailConfirmationCommand,
@@ -12,6 +20,7 @@ import { UserId } from '@/shared/domain.types';
1220
import { JwtAuthGuard } from '@/shared/guards/jwt-auth.guard';
1321
import { ApplicationCommandFactory } from '@/write/shared/application/application-command.factory';
1422

23+
@UseGuards(JwtAuthGuard)
1524
@Controller('email-confirmation')
1625
export class EmailConfirmationRestController {
1726
constructor(private readonly commandBus: CommandBus, private readonly commandFactory: ApplicationCommandFactory) {}
@@ -21,11 +30,33 @@ export class EmailConfirmationRestController {
2130
@HttpCode(204)
2231
async emailConfirmation(
2332
@JwtUserId() userId: UserId,
24-
@Body() { confirmationFor }: EmailConfirmationBody,
33+
@Body() { confirmationFor }: RequestEmailConfirmationBody,
2534
): Promise<void> {
2635
const command = this.commandFactory.applicationCommand((idGenerator) => ({
2736
class: RequestEmailConfirmationApplicationCommand,
28-
...requestEmailConfirmationCommand({ userId, confirmationToken: idGenerator.generate(), confirmationFor }),
37+
...requestEmailConfirmationCommand({
38+
userId,
39+
confirmationToken: idGenerator.generate(),
40+
confirmationFor,
41+
}),
42+
}));
43+
44+
await this.commandBus.execute(command);
45+
}
46+
47+
@Post(APPROVE_ENDPOINT)
48+
@HttpCode(204)
49+
async approveEmailConfirmation(
50+
@JwtUserId() userId: UserId,
51+
@Body() { confirmationToken }: ApproveEmailConfirmationBody,
52+
): Promise<void> {
53+
const command = this.commandFactory.applicationCommand(() => ({
54+
class: ApproveEmailConfirmationApplicationCommand,
55+
...approveEmailConfirmationCommand({
56+
userId,
57+
confirmationToken,
58+
confirmationFor: 'user-registration',
59+
}),
2960
}));
3061

3162
await this.commandBus.execute(command);

packages/shared/src/models/email-confirmation.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { IsString } from 'class-validator';
2+
3+
export const APPROVE_ENDPOINT = '/approval';
4+
5+
export class ApproveEmailConfirmationBody {
6+
@IsString()
7+
confirmationToken: string;
8+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { IsString } from 'class-validator';
2+
3+
export class RequestEmailConfirmationBody {
4+
@IsString()
5+
confirmationFor: string;
6+
}

0 commit comments

Comments
 (0)