user.service.ts 2.24 KB
import { BadRequestException, Injectable, Logger } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Address } from '../../database/schemas/address.schema';
import { User, UserDocument } from '../../database/schemas/user.schema';
import { EncryptorService } from '../../security/encryptor.service';
import { UserCreateDto } from './user.dto';


@Injectable()
export class UserService {
  private readonly logger = new Logger(UserService.name);

  constructor(
    @InjectModel(User.name)
    private readonly userModel: Model<UserDocument>,
    private readonly encryptor: EncryptorService,
  ) {}

  async create(dto: UserCreateDto): Promise<UserDocument> {
    const user = await this.findByEmailOrCpfOrTelefone(
      dto.email,
      dto.cpf,
      dto.telefone,
    );
    if (!user) {
      const model = this.dtoToModel({
        ...dto,
        password: await this.encryptor.encrypt(dto.password),
      });
      return this.userModel.create(model);
    } else {
      throw new BadRequestException('Usuário já existe');
    }
  }

  async findById(id: string): Promise<UserDocument> {
    try {
      const user = await this.userModel.findById(id);
      return user;
    } catch (error) {
      this.logger.error(error);
      return null;
    }
  }

  async findByEmailOrCpfOrTelefone(
    email?: string,
    cpf?: string,
    telefone?: string,
  ): Promise<UserDocument> {
    return await this.userModel.findOne({
      $or: [{ email: email }, { cpf: cpf }, { telefone: telefone }],
    });
  }

  async findByEmailAndPassword(
    email: string,
    password: string,
  ): Promise<UserDocument> {
    return this.userModel.findOne({ email, password });
  }

  async findAll(): Promise<UserDocument[]> {
    return this.userModel.find().exec();
  }

  private dtoToModel(dto: UserCreateDto): User {
    return {
      administrador: false,
      endereco: {
        cep: dto.cep,
      } as Address, // TODO: buscar endereço pelo CEP e preencher outros dados
      contatoEmergencia: dto.contatoEmergencia,
      contatosProfissionais: [],
      cpf: dto.cpf,
      email: dto.email,
      nome: dto.nome,
      password: dto.password,
      telefone: dto.telefone,
      numeroINSS: dto.numeroINSS,
    };
  }
}