Files
pcpuma_unam_api/src/auth/auth.service.ts
T
2022-08-11 19:04:41 -05:00

143 lines
4.6 KiB
TypeScript

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.',
);
}
}