From 887bed8ffb6f8c396dd5f9867b86e6c232332507 Mon Sep 17 00:00:00 2001 From: Krystian Date: Fri, 10 Sep 2021 17:04:57 +0200 Subject: [PATCH 1/2] Add controller and update models --- ...tion-was-started.event-handler.service.ts} | 0 ...st-email-confirmation-automation.module.ts | 2 +- .../email-confirmation.rest-controller.ts | 20 +++++++++++++++++-- .../shared/src/models/email-confirmation.ts | 3 --- .../approve-email-confirmation.ts | 5 +++++ .../request-email-confirmation.ts | 3 +++ 6 files changed, 27 insertions(+), 6 deletions(-) rename packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/{user-registration-was-started.event-handler.ts => user-registration-was-started.event-handler.service.ts} (100%) delete mode 100644 packages/shared/src/models/email-confirmation.ts create mode 100644 packages/shared/src/models/email-confirmation/approve-email-confirmation.ts create mode 100644 packages/shared/src/models/email-confirmation/request-email-confirmation.ts diff --git a/packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/user-registration-was-started.event-handler.ts b/packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/user-registration-was-started.event-handler.service.ts similarity index 100% rename from packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/user-registration-was-started.event-handler.ts rename to packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/user-registration-was-started.event-handler.service.ts diff --git a/packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/when-user-registration-was-started-then-request-email-confirmation-automation.module.ts b/packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/when-user-registration-was-started-then-request-email-confirmation-automation.module.ts index 1f73ea93..2bcc8560 100644 --- a/packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/when-user-registration-was-started-then-request-email-confirmation-automation.module.ts +++ b/packages/api/src/module/automation/when-user-registration-was-started-then-request-email-confirmation/when-user-registration-was-started-then-request-email-confirmation-automation.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { SharedModule } from '@/write/shared/shared.module'; -import { UserRegistrationWasStartedEventHandler } from './user-registration-was-started.event-handler'; +import { UserRegistrationWasStartedEventHandler } from './user-registration-was-started.event-handler.service'; @Module({ imports: [SharedModule], diff --git a/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts b/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts index a007db3f..27c239ac 100644 --- a/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts +++ b/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts @@ -1,7 +1,7 @@ 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, RequestEmailConfirmationBody } from '@coderscamp/shared/models/email-confirmation'; import { JwtUserId } from '@/crud/auth/jwt/jwt-user-id.decorator'; import { @@ -11,6 +11,8 @@ import { import { UserId } from '@/shared/domain.types'; import { JwtAuthGuard } from '@/shared/guards/jwt-auth.guard'; import { ApplicationCommandFactory } from '@/write/shared/application/application-command.factory'; +import { ApproveEmailConfirmationApplicationCommand, approveEmailConfirmationCommand } from '@/module/commands/approve-email-confirmation' +import { ApproveEmailConfirmationBody } from '@coderscamp/shared/models/email-confirmation/approve-email-confirmation' @Controller('email-confirmation') export class EmailConfirmationRestController { @@ -21,7 +23,7 @@ export class EmailConfirmationRestController { @HttpCode(204) async emailConfirmation( @JwtUserId() userId: UserId, - @Body() { confirmationFor }: EmailConfirmationBody, + @Body() { confirmationFor }: RequestEmailConfirmationBody, ): Promise { const command = this.commandFactory.applicationCommand((idGenerator) => ({ class: RequestEmailConfirmationApplicationCommand, @@ -30,4 +32,18 @@ export class EmailConfirmationRestController { await this.commandBus.execute(command); } + + @Post(APPROVE_ENDPOINT) + @HttpCode(204) + async approveEmailConfirmation( + @JwtUserId() userId: UserId, + @Body() { confirmationToken }: ApproveEmailConfirmationBody, + ): Promise { + const command = this.commandFactory.applicationCommand(() => ({ + class: ApproveEmailConfirmationApplicationCommand, + ...approveEmailConfirmationCommand({ userId, confirmationToken, confirmationFor: 'user-registration' }), + })); + + await this.commandBus.execute(command); + } } diff --git a/packages/shared/src/models/email-confirmation.ts b/packages/shared/src/models/email-confirmation.ts deleted file mode 100644 index 22b5276a..00000000 --- a/packages/shared/src/models/email-confirmation.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class EmailConfirmationBody { - confirmationFor: string; -} diff --git a/packages/shared/src/models/email-confirmation/approve-email-confirmation.ts b/packages/shared/src/models/email-confirmation/approve-email-confirmation.ts new file mode 100644 index 00000000..712a4b97 --- /dev/null +++ b/packages/shared/src/models/email-confirmation/approve-email-confirmation.ts @@ -0,0 +1,5 @@ +export const APPROVE_ENDPOINT = '/Approval'; + +export class ApproveEmailConfirmationBody { + confirmationToken: string; +} diff --git a/packages/shared/src/models/email-confirmation/request-email-confirmation.ts b/packages/shared/src/models/email-confirmation/request-email-confirmation.ts new file mode 100644 index 00000000..25852861 --- /dev/null +++ b/packages/shared/src/models/email-confirmation/request-email-confirmation.ts @@ -0,0 +1,3 @@ +export class RequestEmailConfirmationBody { + confirmationFor: string; +} From 3875a22405f28349a1fde43ae6cba699ab10f33a Mon Sep 17 00:00:00 2001 From: Krystian Date: Mon, 20 Sep 2021 23:11:10 +0200 Subject: [PATCH 2/2] Update controller, error and add method to http file --- .vscode/api/email-confirmation.http | 10 ++++++++ .../domain/approve-email-confirmation.spec.ts | 2 +- .../domain/approve-email-confirmation.ts | 2 +- .../email-confirmation.rest-controller.ts | 25 +++++++++++++++---- .../approve-email-confirmation.ts | 5 +++- .../request-email-confirmation.ts | 3 +++ 6 files changed, 39 insertions(+), 8 deletions(-) diff --git a/.vscode/api/email-confirmation.http b/.vscode/api/email-confirmation.http index af391917..fd0327ea 100644 --- a/.vscode/api/email-confirmation.http +++ b/.vscode/api/email-confirmation.http @@ -1,6 +1,7 @@ # email-confirmation.rest-controller.ts @confirmationFor = 'user-registration' +@confirmationToken = 'SomeConfirmationToken' # Request email-confirmation for user POST {{serverUrl}}/email-confirmation @@ -8,3 +9,12 @@ POST {{serverUrl}}/email-confirmation { "confirmationFor": "{{confirmationFor}}" } + +### + +# Approve email-confirmation for user +POST {{serverUrl}}/email-confirmation/Approval + +{ + "confirmationToken": "{{confirmationToken}}" +} diff --git a/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.spec.ts b/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.spec.ts index a85a3217..28bdbbf5 100644 --- a/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.spec.ts +++ b/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.spec.ts @@ -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', ); }); diff --git a/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.ts b/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.ts index 0ac47996..dfae1fc3 100644 --- a/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.ts +++ b/packages/api/src/module/write/email-confirmation/domain/approve-email-confirmation.ts @@ -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)]; }; diff --git a/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts b/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts index 27c239ac..9b6689d2 100644 --- a/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts +++ b/packages/api/src/module/write/email-confirmation/presentation/rest/email-confirmation.rest-controller.ts @@ -1,9 +1,17 @@ import { Body, Controller, HttpCode, Post, UseGuards } from '@nestjs/common'; import { CommandBus } from '@nestjs/cqrs'; -import { APPROVE_ENDPOINT, RequestEmailConfirmationBody } 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, @@ -11,9 +19,8 @@ import { import { UserId } from '@/shared/domain.types'; import { JwtAuthGuard } from '@/shared/guards/jwt-auth.guard'; import { ApplicationCommandFactory } from '@/write/shared/application/application-command.factory'; -import { ApproveEmailConfirmationApplicationCommand, approveEmailConfirmationCommand } from '@/module/commands/approve-email-confirmation' -import { ApproveEmailConfirmationBody } from '@coderscamp/shared/models/email-confirmation/approve-email-confirmation' +@UseGuards(JwtAuthGuard) @Controller('email-confirmation') export class EmailConfirmationRestController { constructor(private readonly commandBus: CommandBus, private readonly commandFactory: ApplicationCommandFactory) {} @@ -27,7 +34,11 @@ export class EmailConfirmationRestController { ): Promise { 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); @@ -41,7 +52,11 @@ export class EmailConfirmationRestController { ): Promise { const command = this.commandFactory.applicationCommand(() => ({ class: ApproveEmailConfirmationApplicationCommand, - ...approveEmailConfirmationCommand({ userId, confirmationToken, confirmationFor: 'user-registration' }), + ...approveEmailConfirmationCommand({ + userId, + confirmationToken, + confirmationFor: 'user-registration', + }), })); await this.commandBus.execute(command); diff --git a/packages/shared/src/models/email-confirmation/approve-email-confirmation.ts b/packages/shared/src/models/email-confirmation/approve-email-confirmation.ts index 712a4b97..61c1bc0d 100644 --- a/packages/shared/src/models/email-confirmation/approve-email-confirmation.ts +++ b/packages/shared/src/models/email-confirmation/approve-email-confirmation.ts @@ -1,5 +1,8 @@ -export const APPROVE_ENDPOINT = '/Approval'; +import { IsString } from 'class-validator'; + +export const APPROVE_ENDPOINT = '/approval'; export class ApproveEmailConfirmationBody { + @IsString() confirmationToken: string; } diff --git a/packages/shared/src/models/email-confirmation/request-email-confirmation.ts b/packages/shared/src/models/email-confirmation/request-email-confirmation.ts index 25852861..ea72c3da 100644 --- a/packages/shared/src/models/email-confirmation/request-email-confirmation.ts +++ b/packages/shared/src/models/email-confirmation/request-email-confirmation.ts @@ -1,3 +1,6 @@ +import { IsString } from 'class-validator'; + export class RequestEmailConfirmationBody { + @IsString() confirmationFor: string; }