From b4da40e915cdd4303506d36ef5055b6efdc158bd Mon Sep 17 00:00:00 2001 From: lemuel Date: Tue, 30 Aug 2022 19:36:53 -0500 Subject: [PATCH] login de usuario mejorado --- src/app.module.ts | 7 +- src/auth/auth.service.ts | 61 +++-------------- .../entity/views/informacion-usuario.view.ts | 68 +++++++++++++++++++ src/usuario/usuario.module.ts | 3 +- src/usuario/usuario.service.ts | 40 ++++++++++- 5 files changed, 124 insertions(+), 55 deletions(-) create mode 100644 src/usuario/entity/views/informacion-usuario.view.ts diff --git a/src/app.module.ts b/src/app.module.ts index 44ac88a..68c9e51 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -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, ], }; }, diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index a0b5420..be658b5 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -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) { diff --git a/src/usuario/entity/views/informacion-usuario.view.ts b/src/usuario/entity/views/informacion-usuario.view.ts new file mode 100644 index 0000000..367a19c --- /dev/null +++ b/src/usuario/entity/views/informacion-usuario.view.ts @@ -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; +} diff --git a/src/usuario/usuario.module.ts b/src/usuario/usuario.module.ts index 55b457f..df94c8a 100644 --- a/src/usuario/usuario.module.ts +++ b/src/usuario/usuario.module.ts @@ -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], diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts index 18a297c..108b71a 100644 --- a/src/usuario/usuario.service.ts +++ b/src/usuario/usuario.service.ts @@ -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, + @InjectRepository(InformacionUsuarioView) + private equipoPrestamoView: Repository, 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();