Executando verificação de segurança...
1
megbr
1 min de leitura ·

[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,
    });
}
Carregando publicação patrocinada...
1

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.