refactor: removed some boilerplate code
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
Reference in New Issue
Block a user