pcpuma_unam_api/src/auth/auth.service.ts

131 lines
4.5 KiB
TypeScript
Raw Normal View History

2022-04-22 02:52:40 +00:00
import {
2022-08-31 16:29:48 +00:00
BadRequestException,
2022-04-22 02:52:40 +00:00
Injectable,
UnauthorizedException,
} from '@nestjs/common';
2022-04-21 21:31:26 +00:00
import { JwtService } from '@nestjs/jwt';
2022-10-16 04:51:56 +00:00
import { Operador } from '../operador/entity/operador.entity';
2022-10-17 16:49:59 +00:00
import { Usuario } from '../usuario/entity/usuario.entity';
2022-04-22 01:33:05 +00:00
import { BcryptService } from '../bcrypt/bcrypt.service';
2022-04-22 02:52:40 +00:00
import { ModuloService } from '../modulo/modulo.service';
2022-04-22 01:33:05 +00:00
import { OperadorService } from '../operador/operador.service';
import { UsuarioService } from '../usuario/usuario.service';
2022-10-16 04:51:56 +00:00
import { JwtPayloadAdmin } from './dto/jwt-payload-admin';
import { JwtPayloadOperador } from './dto/jwt-payload-operador';
import { JwtPayloadUsuario } from './dto/jwt-payload-usuario';
2022-04-21 21:31:26 +00:00
@Injectable()
export class AuthService {
2022-04-22 01:33:05 +00:00
constructor(
private bcryptService: BcryptService,
2022-04-22 02:52:40 +00:00
private jwtService: JwtService,
private moduloService: ModuloService,
2022-04-22 01:33:05 +00:00
private operadorService: OperadorService,
private usuarioService: UsuarioService,
) {}
2022-04-21 21:31:26 +00:00
2022-12-19 17:29:36 +00:00
loginAdmin(admin: string, password: string): Promise<{ token: string }> {
2022-10-23 22:52:46 +00:00
return this.operadorService.findAdmin(admin).then((admin) => {
2022-10-16 04:51:56 +00:00
this.validacionBasica(admin, password);
2022-10-17 16:49:59 +00:00
this.validacionOperador(admin);
2022-10-16 04:51:56 +00:00
2022-12-19 17:29:36 +00:00
// Creamos payload apartir de la interface que le corresponde a este tipo de usaurio
2022-10-16 04:51:56 +00:00
const JwtPayload: JwtPayloadAdmin = {
Operador: {
id_operador: admin.id_operador,
operador: admin.operador,
nombre: admin.nombre,
2022-10-17 16:49:59 +00:00
tipoUsuario: { id_tipo_usuario: admin.tipoUsuario.id_tipo_usuario },
2022-10-16 04:51:56 +00:00
},
};
2022-10-17 16:49:59 +00:00
2022-11-22 04:20:35 +00:00
// Los super admin y sistema no tienen institución
2023-01-10 23:25:23 +00:00
if (JwtPayload.Operador.tipoUsuario.id_tipo_usuario === 3)
2022-10-26 05:11:57 +00:00
JwtPayload.Operador.institucion = {
id_institucion: admin.institucion.id_institucion,
2023-01-10 23:25:23 +00:00
logo: admin.institucion.logo,
2022-10-26 05:11:57 +00:00
};
2022-12-19 17:29:36 +00:00
return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token
2022-04-22 01:33:05 +00:00
});
}
2022-12-19 17:29:36 +00:00
async loginOperador(
id_modulo: number,
operador: string,
password: string,
): Promise<{ token: string }> {
2022-10-24 20:21:41 +00:00
const modulo = await this.moduloService.findById(id_modulo);
2022-04-22 02:52:40 +00:00
return this.operadorService
2022-10-23 22:52:46 +00:00
.findOperador(modulo.institucion, operador)
2022-10-16 04:51:56 +00:00
.then((operador) => {
this.validacionBasica(operador, password);
2022-10-17 16:49:59 +00:00
this.validacionOperador(operador);
2022-10-16 04:51:56 +00:00
2022-12-19 17:29:36 +00:00
// Creamos payload apartir de la interface que le corresponde a este tipo de usaurio
2022-10-16 04:51:56 +00:00
const JwtPayload: JwtPayloadOperador = {
Operador: {
id_operador: operador.id_operador,
operador: operador.operador,
nombre: operador.nombre,
institucion: {
id_institucion: operador.institucion.id_institucion,
2023-01-10 23:25:23 +00:00
logo: operador.institucion.logo,
2022-10-16 04:51:56 +00:00
},
tipoUsuario: {
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
},
},
2022-12-19 17:29:36 +00:00
Modulo: { id_modulo: modulo.id_modulo },
2022-10-16 04:51:56 +00:00
};
2023-01-10 23:25:23 +00:00
2022-12-19 17:29:36 +00:00
return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token
2022-04-22 02:52:40 +00:00
});
2022-04-22 01:33:05 +00:00
}
2022-12-19 17:29:36 +00:00
loginUsuario(usuario: string, password: string): Promise<{ token: string }> {
2022-10-24 23:15:09 +00:00
return this.usuarioService.findByUsuario(usuario).then((usuario) => {
2022-12-19 17:29:36 +00:00
// Validamos que este registrado. Sin password = no registrado
2022-10-24 23:15:09 +00:00
if (usuario && !usuario.password)
throw new BadRequestException('Este usuario no ha sido registrado.');
this.validacionBasica(usuario, password);
2022-10-17 03:45:31 +00:00
2022-12-19 17:29:36 +00:00
// Creamos payload apartir de la interface que le corresponde a este tipo de usaurio
2022-10-24 23:15:09 +00:00
const JwtPayload: JwtPayloadUsuario = {
Usuario: {
id_usuario: usuario.id_usuario,
usuario: usuario.usuario,
nombre: usuario.nombre,
tipoUsuario: {
id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario,
2022-10-17 03:45:31 +00:00
},
2022-10-24 23:15:09 +00:00
},
};
2022-10-17 03:45:31 +00:00
2022-12-19 17:29:36 +00:00
return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token
2022-10-24 23:15:09 +00:00
});
}
2022-10-16 04:51:56 +00:00
2022-10-17 16:49:59 +00:00
private validacionBasica(
operadorUsuario: Operador | Usuario,
password: string,
2022-12-19 17:29:36 +00:00
): void {
// Validamos que el operador o usuario existan y que el password que se envió coincida con el de la db
2022-10-17 16:49:59 +00:00
if (
!operadorUsuario ||
!this.bcryptService.comparar(password, operadorUsuario.password)
)
2022-10-16 04:51:56 +00:00
throw new BadRequestException(
'Usuario y/o password incorrectos, ingresa unas credenciales válidas.',
);
2022-12-19 17:29:36 +00:00
return;
2022-10-17 16:49:59 +00:00
}
2022-12-19 17:29:36 +00:00
private validacionOperador(operador: Operador): void {
// Validamos que la cuenta del operador esta activa
2022-10-16 04:51:56 +00:00
if (!operador.activo)
throw new UnauthorizedException('Esta cuenta se encuentra desactivada.');
2022-12-19 17:29:36 +00:00
return;
2022-10-16 04:51:56 +00:00
}
2022-04-21 21:31:26 +00:00
}