Skip to content
This repository was archived by the owner on Mar 20, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .vscode/api/email-confirmation.http
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
# email-confirmation.rest-controller.ts

@confirmationFor = 'user-registration'
@confirmationToken = 'SomeConfirmationToken'

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

{
"confirmationFor": "{{confirmationFor}}"
}

###

# Approve email-confirmation for user
POST {{serverUrl}}/email-confirmation/Approval

{
"confirmationToken": "{{confirmationToken}}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ describe('Approve email confirmation', () => {

// when - them
expect(() => approveEmailConfirmation(emailConfirmationWithOldToken)(pastEvents)).toThrow(
'An attempt was made on obsolete token',
'An attempt was made on obsolete confirmation token',
);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export const approveEmailConfirmation =
throw new Error('Email confirmation has been already approved');

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

return [emailConfirmationWasApprovedEvent(command.data)];
};
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
import { Body, Controller, HttpCode, Post, UseGuards } from '@nestjs/common';
import { CommandBus } from '@nestjs/cqrs';

import { EmailConfirmationBody } from '@coderscamp/shared/models/email-confirmation';
import {
APPROVE_ENDPOINT,
ApproveEmailConfirmationBody,
} from '@coderscamp/shared/models/email-confirmation/approve-email-confirmation';
import { RequestEmailConfirmationBody } from '@coderscamp/shared/models/email-confirmation/request-email-confirmation';

import { JwtUserId } from '@/crud/auth/jwt/jwt-user-id.decorator';
import {
ApproveEmailConfirmationApplicationCommand,
approveEmailConfirmationCommand,
} from '@/module/commands/approve-email-confirmation';
import {
RequestEmailConfirmationApplicationCommand,
requestEmailConfirmationCommand,
Expand All @@ -12,6 +20,7 @@ import { UserId } from '@/shared/domain.types';
import { JwtAuthGuard } from '@/shared/guards/jwt-auth.guard';
import { ApplicationCommandFactory } from '@/write/shared/application/application-command.factory';

@UseGuards(JwtAuthGuard)
@Controller('email-confirmation')
export class EmailConfirmationRestController {
constructor(private readonly commandBus: CommandBus, private readonly commandFactory: ApplicationCommandFactory) {}
Expand All @@ -21,11 +30,33 @@ export class EmailConfirmationRestController {
@HttpCode(204)
async emailConfirmation(
@JwtUserId() userId: UserId,
@Body() { confirmationFor }: EmailConfirmationBody,
@Body() { confirmationFor }: RequestEmailConfirmationBody,
): Promise<void> {
const command = this.commandFactory.applicationCommand((idGenerator) => ({
class: RequestEmailConfirmationApplicationCommand,
...requestEmailConfirmationCommand({ userId, confirmationToken: idGenerator.generate(), confirmationFor }),
...requestEmailConfirmationCommand({
userId,
confirmationToken: idGenerator.generate(),
confirmationFor,
}),
}));

await this.commandBus.execute(command);
}

@Post(APPROVE_ENDPOINT)
@HttpCode(204)
async approveEmailConfirmation(
@JwtUserId() userId: UserId,
@Body() { confirmationToken }: ApproveEmailConfirmationBody,
): Promise<void> {
const command = this.commandFactory.applicationCommand(() => ({
class: ApproveEmailConfirmationApplicationCommand,
...approveEmailConfirmationCommand({
userId,
confirmationToken,
confirmationFor: 'user-registration',
}),
}));

await this.commandBus.execute(command);
Expand Down
3 changes: 0 additions & 3 deletions packages/shared/src/models/email-confirmation.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { IsString } from 'class-validator';

export const APPROVE_ENDPOINT = '/approval';

export class ApproveEmailConfirmationBody {
@IsString()
confirmationToken: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { IsString } from 'class-validator';

export class RequestEmailConfirmationBody {
@IsString()
confirmationFor: string;
}