import { BadRequestException, Injectable, UnauthorizedException, } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { Operador } from '../operador/entity/operador.entity'; import { Usuario } from '../usuario/entity/usuario.entity'; import { BcryptService } from '../bcrypt/bcrypt.service'; import { ModuloService } from '../modulo/modulo.service'; import { OperadorService } from '../operador/operador.service'; import { UsuarioService } from '../usuario/usuario.service'; import { JwtPayloadAdmin } from './dto/jwt-payload-admin'; import { JwtPayloadOperador } from './dto/jwt-payload-operador'; import { JwtPayloadUsuario } from './dto/jwt-payload-usuario'; @Injectable() export class AuthService { constructor( private bcryptService: BcryptService, private jwtService: JwtService, private moduloService: ModuloService, private operadorService: OperadorService, private usuarioService: UsuarioService, ) {} loginAdmin(admin: string, password: string) { return this.operadorService.findInfoOperadorAdmin(admin).then((admin) => { this.validacionBasica(admin, password); this.validacionOperador(admin); // Creo payload apartir de la interface que le corresponde a este tipo de usaurio const JwtPayload: JwtPayloadAdmin = { Operador: { id_operador: admin.id_operador, operador: admin.operador, nombre: admin.nombre, institucion: { id_institucion: admin.institucion.id_institucion }, tipoUsuario: { id_tipo_usuario: admin.tipoUsuario.id_tipo_usuario }, }, }; // "Firmo"/creo el token return { token: this.jwtService.sign(JwtPayload) }; }); } async loginOperador(id_modulo: number, operador: string, password: string) { const modulo = await this.moduloService.findInfoModuloById(id_modulo); return this.operadorService .findInfoOperador(modulo.institucion, operador) .then((operador) => { this.validacionBasica(operador, password); this.validacionOperador(operador); // Creo payload apartir de la interface que le corresponde a este tipo de usaurio const JwtPayload: JwtPayloadOperador = { Operador: { id_operador: operador.id_operador, operador: operador.operador, nombre: operador.nombre, institucion: { id_institucion: operador.institucion.id_institucion, }, tipoUsuario: { id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario, }, }, }; // "Firmo"/creo el token if (operador.tipoUsuario.id_tipo_usuario === 4) JwtPayload.Modulo.id_modulo = modulo.id_modulo; return { token: this.jwtService.sign(JwtPayload) }; }); } loginUsuario(usuario: string, password: string) { return this.usuarioService .findInfoUsuarioByUsuario(usuario) .then((usuario) => { // Sin password = no registrado, valida que este registrado if (usuario && !usuario.password) throw new BadRequestException('Este usuario no ha sido registrado.'); this.validacionBasica(usuario, password); // Creo payload apartir de la interface que le corresponde a este tipo de usaurio const JwtPayload: JwtPayloadUsuario = { Usuario: { id_usuario: usuario.id_usuario, usuario: usuario.usuario, nombre: usuario.nombre, tipoUsuario: { id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario, }, }, }; // "Firmo"/creo el token return { token: this.jwtService.sign(JwtPayload) }; }); } private validacionBasica( operadorUsuario: Operador | Usuario, password: string, ) { // Valido que el operador o usuario existan y que el password sea el correcto if ( !operadorUsuario || !this.bcryptService.comparar(password, operadorUsuario.password) ) throw new BadRequestException( 'Usuario y/o password incorrectos, ingresa unas credenciales vĂ¡lidas.', ); } private validacionOperador(operador: Operador) { // Valido que el operador este activo if (!operador.activo) throw new UnauthorizedException('Esta cuenta se encuentra desactivada.'); } }