import { ConflictException, 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 { JwtPayload } from './dto/jwt-payload'; @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.findAdmin(admin, false).then((operador) => { this.validarLogin(operador, password); if (!operador.activo) throw new ConflictException('Esta cuenta se encuentra desactivada.'); const payload: JwtPayload = { id_operador: operador.id_operador, nombre: operador.nombre, operador: operador.operador, institucion: operador.institucion ? { id_institucion: operador.institucion.id_institucion } : null, tipoUsuario: { id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario, }, }; return { operador, token: this.jwtService.sign(payload) }; }); } async loginOperador(id_modulo: number, operador: string, password: string) { const modulo = await this.moduloService.findById(id_modulo); return this.operadorService .findByOperador(modulo.institucion, operador, false) .then((operador) => { this.validarLogin(operador, password); if ( operador.institucion.id_institucion != modulo.institucion.id_institucion ) throw new ConflictException( 'Este módulo no pertenece a tu institución, selecciona una que si.', ); const payload: JwtPayload = { id_operador: operador.id_operador, id_modulo: modulo.id_modulo, nombre: operador.nombre, operador: operador.operador, institucion: operador.institucion ? { id_institucion: operador.institucion.id_institucion } : null, tipoUsuario: { id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario, }, }; return { token: this.jwtService.sign(payload) }; }); } loginUsuario(usuario: string, password: string) { return this.usuarioService .findByUsuario(usuario, false, false, true) .then((usuario) => { this.validarLogin(usuario, password); const instituciones: { id_institucion_usuario: number; institucionCarrera: { id_institucion_carrera: number; institucion: { id_institucion: number }; carrera: { id_carrera: number }; }; }[] = []; for (let i = 0; i < usuario.instituciones.length; i++) if ( usuario.instituciones[i].activo && !usuario.instituciones[i].multa ) instituciones.push({ id_institucion_usuario: usuario.instituciones[i].id_institucion_usuario, institucionCarrera: { id_institucion_carrera: usuario.instituciones[i].institucionCarrera .id_institucion_carrera, carrera: { id_carrera: usuario.instituciones[i].institucionCarrera.carrera .id_carrera, }, institucion: { id_institucion: usuario.instituciones[i].institucionCarrera.institucion .id_institucion, }, }, }); const payload: JwtPayload = { id_usuario: usuario.id_usuario, nombre: usuario.nombre, usuario: usuario.usuario, instituciones: instituciones, tipoUsuario: { id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario, }, }; return { token: this.jwtService.sign(payload), usuario }; }); } validarLogin(usuarioOperador: Usuario | Operador, password: string) { if ( !usuarioOperador || !this.bcryptService.comparar(password, usuarioOperador.password) ) throw new UnauthorizedException( 'Usuario y/o password incorrectos, ingresa unas credenciales válidas.', ); } }