refactor: removed some boilerplate code

This commit is contained in:
user
2022-04-19 18:39:03 +02:00
parent 226abc4530
commit 6b09eec9c9
9 changed files with 24 additions and 33 deletions

View File

@@ -1,11 +1,10 @@
/* Creating interfaces like this may be useful if you have a front end
web/mobile application or other microservices that need to talk to
your API since you can share them as a git submodule, a npm package/
library or in a monorepo.
/* Creating interfaces like this may be useful if you need to share types with
a front end web/mobile application, microservices, or other TypeScript APIs.
You can share interfaces as a git submodule, a npm package, a library or in a monorepo, etc.
*/
export interface CreateUser {
email: string;
country: string;
postalCode: string;
street: string;
readonly email: string;
readonly country: string;
readonly postalCode: string;
readonly street: string;
}

View File

@@ -2,6 +2,11 @@ import { BaseEntityProps } from '@libs/ddd/domain/base-classes/entity.base';
import { ApiProperty } from '@nestjs/swagger';
import { IdResponse } from '../dtos/id.response.dto';
/**
* Most of our response objects will have properties like
* id, createdAt and updatedAt so we can move them to a
* separate class and extend it to avoid duplication.
*/
export class ResponseBase extends IdResponse {
constructor(entity: BaseEntityProps) {
super(entity.id.value);
@@ -10,8 +15,8 @@ export class ResponseBase extends IdResponse {
}
@ApiProperty({ example: '2020-11-24T17:43:15.970Z' })
createdAt: string;
readonly createdAt: string;
@ApiProperty({ example: '2020-11-24T17:43:15.970Z' })
updatedAt: string;
readonly updatedAt: string;
}

View File

@@ -10,5 +10,5 @@ export class IdResponse implements Id {
@ApiProperty({ example: '2cdc8ab1-6d50-49cc-ba14-54e4ac7ec231' })
@Field() // <- only if you are using GraphQL
id: string;
readonly id: string;
}

View File

@@ -7,8 +7,8 @@ import { ID } from '@src/libs/ddd/domain/value-objects/id.value-object';
import { ConflictException } from '@src/libs/exceptions';
import { match, Result } from 'oxide.ts/dist';
import { CreateUserCommand } from './create-user.command';
import { CreateUserHttpRequest } from './create-user.request.dto';
import { UserAlreadyExistsError } from '../../errors/user.errors';
import { CreateUserRequest } from './create-user.request.dto';
@Controller(routesV1.version)
export class CreateUserHttpController {
@@ -27,7 +27,7 @@ export class CreateUserHttpController {
@ApiResponse({
status: HttpStatus.BAD_REQUEST,
})
async create(@Body() body: CreateUserHttpRequest): Promise<IdResponse> {
async create(@Body() body: CreateUserRequest): Promise<IdResponse> {
const command = new CreateUserCommand(body);
const result: Result<

View File

@@ -3,14 +3,14 @@ import { MessagePattern } from '@nestjs/microservices';
import { IdResponse } from '@libs/ddd/interface-adapters/dtos/id.response.dto';
import { CommandBus } from '@nestjs/cqrs';
import { CreateUserCommand } from './create-user.command';
import { CreateUserMessageRequest } from './create-user.request.dto';
import { CreateUserRequest } from './create-user.request.dto';
@Controller()
export class CreateUserMessageController {
constructor(private readonly commandBus: CommandBus) {}
@MessagePattern('user.create') // <- Subscribe to a microservice message
async create(message: CreateUserMessageRequest): Promise<IdResponse> {
async create(message: CreateUserRequest): Promise<IdResponse> {
const command = new CreateUserCommand(message);
const id = await this.commandBus.execute(command);

View File

@@ -45,9 +45,3 @@ export class CreateUserRequest implements CreateUser {
@Field() // <- only if you are using graphql
readonly street: string;
}
export class CreateUserHttpRequest extends CreateUserRequest
implements CreateUser {}
export class CreateUserMessageRequest extends CreateUserRequest
implements CreateUser {}

View File

@@ -50,5 +50,3 @@ export class UserResponse extends ResponseBase implements User {
@Field() // <- only if you are using GraphQL
street: string;
}
export class UserHttpResponse extends UserResponse implements User {}

View File

@@ -1,12 +1,12 @@
import { Body, Controller, Get, HttpStatus } from '@nestjs/common';
import { routesV1 } from '@config/app.routes';
import { UserHttpResponse } from '@modules/user/dtos/user.response.dto';
import { QueryBus } from '@nestjs/cqrs';
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
import { Result } from 'oxide.ts/dist';
import { FindUsersQuery } from './find-users.query';
import { FindUsersHttpRequest } from './find-users.request.dto';
import { UserEntity } from '../../domain/entities/user.entity';
import { UserResponse } from '../../dtos/user.response.dto';
import { FindUsersRequest } from './find-users.request.dto';
@Controller(routesV1.version)
export class FindUsersHttpController {
@@ -16,11 +16,9 @@ export class FindUsersHttpController {
@ApiOperation({ summary: 'Find users' })
@ApiResponse({
status: HttpStatus.OK,
type: UserHttpResponse,
type: UserResponse,
})
async findUsers(
@Body() request: FindUsersHttpRequest,
): Promise<UserHttpResponse[]> {
async findUsers(@Body() request: FindUsersRequest): Promise<UserResponse[]> {
const query = new FindUsersQuery(request);
const result: Result<UserEntity[], Error> = await this.queryBys.execute(
query,
@@ -28,6 +26,6 @@ export class FindUsersHttpController {
/* Returning Response classes which are responsible
for whitelisting data that is sent to the user */
return result.unwrap().map(user => new UserHttpResponse(user));
return result.unwrap().map(user => new UserResponse(user));
}
}

View File

@@ -34,6 +34,3 @@ export class FindUsersRequest implements FindUsers {
@Field({ nullable: true }) // <- only if you are using GraphQL
readonly street: string;
}
export class FindUsersHttpRequest extends FindUsersRequest
implements FindUsers {}