[Dúvida][NestJS] O que eu poderia melhorar neste código?
Estou me aventurando em NestJS mas tenho me incomodado um pouco com a maneira que tenho escrito as funções dos services. O código que vou apresentar funciona como esperado, mas imagino que possa ser melhorado. Principalmente onde o usuário é armazenado no banco de dados.
Contexto da função: Deve criar um usuário com nome, e-mail e senha. Para que o usuário faça parte do tenant correto é feita a extração o id da empresa (tenant) do token jwt.
CreateUserDTO:
import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';
export class CreateUserDTO {
@IsNotEmpty({ message: 'O nome não pode ser vazio' })
name: string;
@IsEmail({}, { message: 'E-mail deve ser do tipo e-mail' })
@IsNotEmpty({ message: 'O e-mail não pode ser vazio' })
email: string;
@IsNotEmpty({ message: 'A senha não pode ser vazia' })
@MinLength(6, { message: 'A senha deve ser possuir pelo menos 6 caracteres' })
password: string;
}
UserService:
async create(postedUser: CreateUserDTO): Promise<void> {
const company = await this.companyService.findOne(this.request['user'].company);
if (!company) {
throw new HttpException(
`A empresa id ${this.request['user'].company} não existe.`,
HttpStatus.NOT_FOUND,
);
}
const existingUser = await this.findByEmail(postedUser.email);
if (existingUser) {
throw new HttpException(
`A conta com o e-mail ${postedUser.email} já existe`,
HttpStatus.CONFLICT,
);
}
postedUser.password = await bcrypt.hash(postedUser.password, 10);
await this.userRepository.save({
company: company,
name: postedUser.name,
email: postedUser.email,
password: postedUser.password,
});
}
Se estiver usando um banco de dados relacional, eu recomendo você mover essa responsabilidade para seu banco de dados, criando unique index para email e o criando um foreign key para o company.
Essa sua validação pela aplicação, em cenários de alta concorrência, ainda existe uma pequena possibilidade de duas pessoas conseguirem criar contas com o mesmo endereço de e-mail. O banco de dados garante esse problema de duplicagem com unique indexes.
E para customizar seus erros com os erros de banco, eu recomendo você criar middlewares.