login de usuario mejorado

This commit is contained in:
lemuel 2022-08-30 19:36:53 -05:00
parent 58cab72127
commit b4da40e915
5 changed files with 124 additions and 55 deletions

View File

@ -43,7 +43,6 @@ import { Carrito } from './carrito/entity/carrito.entity';
import { CarritoMotivo } from './carrito-motivo/entity/carrito-motivo.entity';
import { Dia } from './institucion-dia/entity/dia.entity';
import { Equipo } from './equipo/entity/equipo.entity';
// import { EquipoPrestamoView } from './equipo/entity/views/equipo-prestamo.view';
import { EquipoMotivo } from './equipo-motivo/entity/equipo-motivo.entity';
import { EquipoPrograma } from './equipo-programa/entity/equipo-programa.entity';
import { EquipoTipoEntrada } from './equipo-tipo-entrada/entity/equipo-tipo-entrada.entity';
@ -71,6 +70,9 @@ import { TipoEntrada } from './institucion-tipo-entrada/entity/tipo-entrada.enti
import { TipoUsuario } from './tipo-usuario/entity/tipo-usuario.entity';
import { Usuario } from './usuario/entity/usuario.entity';
// import { EquipoPrestamoView } from './equipo/entity/views/equipo-prestamo.view';
import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuario.view';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
@ -103,7 +105,6 @@ import { Usuario } from './usuario/entity/usuario.entity';
CarritoMotivo,
Dia,
Equipo,
// EquipoPrestamoView,
EquipoMotivo,
EquipoPrograma,
EquipoTipoEntrada,
@ -130,6 +131,8 @@ import { Usuario } from './usuario/entity/usuario.entity';
TipoEntrada,
TipoUsuario,
Usuario,
// EquipoPrestamoView,
InformacionUsuarioView,
],
};
},

View File

@ -77,57 +77,16 @@ export class AuthService {
}
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 };
});
return this.usuarioService.informacionUsuario(usuario).then((data) => {
if (
!data.usuario ||
!this.bcryptService.comparar(password, data.password)
)
throw new UnauthorizedException(
'Usuario y/o password incorrectos, ingresa unas credenciales válidas.',
);
return { token: this.jwtService.sign(data.usuario) };
});
}
validarLogin(usuarioOperador: Usuario | Operador, password: string) {

View File

@ -0,0 +1,68 @@
import { DataSource, ViewEntity, ViewColumn } from 'typeorm';
import { Carrera } from '../../../institucion-carrera/entity/carrera.entity';
import { Institucion } from '../../../institucion/entity/institucion.entity';
import { InstitucionCarrera } from '../../../institucion-carrera/entity/institucion-carrera.entity';
import { InstitucionUsuario } from '../../../institucion-usuario/entity/institucion-usuario.entity';
import { TipoUsuario } from '../../../tipo-usuario/entity/tipo-usuario.entity';
import { Usuario } from '../usuario.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.from(Usuario, 'u')
.select('u.id_usuario', 'id_usuario')
.addSelect('u.nombre', 'nombre')
.addSelect('u.password', 'password')
.addSelect('u.usuario', 'usuario')
.addSelect('tu.id_tipo_usuario', 'id_tipo_usuario')
.addSelect('is.activo', 'activo')
.addSelect('is.id_institucion_usuario', 'id_institucion_usuario')
.addSelect('ic.id_institucion_carrera', 'id_institucion_carrera')
.addSelect('is.multa', 'multa')
.addSelect('c.id_carrera', 'id_carrera')
.addSelect('i.id_institucion', 'id_institucion')
.innerJoin(InstitucionUsuario, 'is', 'is.id_usuario = u.id_usuario')
.innerJoin(TipoUsuario, 'tu', 'tu.id_tipo_usuario = u.id_tipo_usuario')
.innerJoin(
InstitucionCarrera,
'ic',
'ic.id_institucion_carrera = is.id_institucion_carrera',
)
.innerJoin(Carrera, 'c', 'c.id_carrera = ic.id_carrera')
.innerJoin(Institucion, 'i', 'i.id_institucion = ic.id_institucion'),
})
export class InformacionUsuarioView {
@ViewColumn()
id_usuario: number;
@ViewColumn()
activo: boolean;
@ViewColumn()
multa: boolean;
@ViewColumn()
id_carrera: number;
@ViewColumn()
id_institucion: number;
@ViewColumn()
id_institucion_carrera: number;
@ViewColumn()
id_institucion_usuario: number;
@ViewColumn()
id_tipo_usuario: number;
@ViewColumn()
nombre: string;
@ViewColumn()
password: string;
@ViewColumn()
usuario: string;
}

View File

@ -4,6 +4,7 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { UsuarioController } from './usuario.controller';
import { UsuarioService } from './usuario.service';
import { Usuario } from './entity/usuario.entity';
import { InformacionUsuarioView } from './entity/views/informacion-usuario.view';
import { BcryptModule } from '../bcrypt/bcrypt.module';
import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionCarreraModule } from '../institucion-carrera/institucion-carrera.module';
@ -20,7 +21,7 @@ import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
NodemailerModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TipoUsuarioModule,
TypeOrmModule.forFeature([Usuario]),
TypeOrmModule.forFeature([Usuario, InformacionUsuarioView]),
],
controllers: [UsuarioController],
providers: [UsuarioService],

View File

@ -8,6 +8,7 @@ import { Repository } from 'typeorm';
import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity';
import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity';
import { Usuario } from './entity/usuario.entity';
import { InformacionUsuarioView } from './entity/views/informacion-usuario.view';
import { BcryptService } from '../bcrypt/bcrypt.service';
import { InstitucionService } from '../institucion/institucion.service';
import { InstitucionCarreraService } from '../institucion-carrera/institucion-carrera.service';
@ -19,6 +20,8 @@ import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
export class UsuarioService {
constructor(
@InjectRepository(Usuario) private repository: Repository<Usuario>,
@InjectRepository(InformacionUsuarioView)
private equipoPrestamoView: Repository<InformacionUsuarioView>,
private bcryptService: BcryptService,
private institucionService: InstitucionService,
private institucionCarreraService: InstitucionCarreraService,
@ -128,7 +131,7 @@ export class UsuarioService {
});
}
findByUsuario(
async findByUsuario(
usuario: string,
validarNoExiste = true,
password = false,
@ -154,6 +157,41 @@ export class UsuarioService {
});
}
informacionUsuario(usuario: string) {
return this.equipoPrestamoView.find({ where: { usuario } }).then((data) => {
const instituciones: {
id_institucion_usuario: number;
institucionCarrera: {
id_institucion_carrera: number;
institucion: { id_institucion: number };
carrera: { id_carrera: number };
};
}[] = [];
if (data.length === 0) return { usuario: null, password: null };
for (let i = 0; i < data.length; i++)
if (data[i].activo && !data[i].multa)
instituciones.push({
id_institucion_usuario: data[i].id_institucion_usuario,
institucionCarrera: {
id_institucion_carrera: data[i].id_institucion_carrera,
institucion: { id_institucion: data[i].id_institucion },
carrera: { id_carrera: data[i].id_carrera },
},
});
return {
usuario: {
id_usuario: data[0].id_usuario,
nombre: data[0].nombre,
usuario: data[0].usuario,
instituciones,
tipoUsuario: { id_tipo_usuario: data[0].id_tipo_usuario },
},
password: data[0].password,
};
});
}
passwordReset(id_usuario: number) {
const password = this.bcryptService.generarPassword();