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, private readonly encryptor: EncryptorService, ) {} async create(dto: UserCreateDto): Promise { 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 { 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 { return await this.userModel.findOne({ $or: [{ email: email }, { cpf: cpf }, { telefone: telefone }], }); } async findByEmailAndPassword( email: string, password: string, ): Promise { return this.userModel.findOne({ email, password }); } async findAll(): Promise { 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, }; } }