aparentemente todo funciona

This commit is contained in:
2022-10-16 19:17:04 -05:00
parent 0a43d85d72
commit b32d0a2f4a
12 changed files with 226 additions and 125 deletions
+2
View File
@@ -90,6 +90,7 @@ import { FullInformacionOperadorView } from './operador/entity/views/full-inform
import { FullInformacionPrestamoView } from './prestamo/entity/views/full-informacion-prestamo.view';
import { PrestamoInformacionView } from './prestamo/entity/views/prestamo-informacion.view';
import { InformacionPrestamoView } from './prestamo/entity/views/informacion-prestamo.view';
import { FullInformacionUsuarioView } from './usuario/entity/views/full-informacion-usuario.view';
import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuario.view';
@Module({
@@ -169,6 +170,7 @@ import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuar
FullInformacionPrestamoView,
PrestamoInformacionView,
InformacionPrestamoView,
FullInformacionUsuarioView,
InformacionUsuarioView,
],
};
+1 -1
View File
@@ -34,7 +34,7 @@ export class JwtStrategyService extends PassportStrategy(Strategy) {
if ('Usuario' in payload)
await this.usuarioService
.findById(payload.Usuario.id_usuario, true, true)
.findInfoUsuarioById(payload.Usuario.id_usuario)
.then((usuario) => (user.usuario = usuario));
else if ('Operador' in payload)
await this.operadorService
@@ -3,7 +3,6 @@ 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';
import { Usuario } from '../../../usuario/entity/usuario.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
@@ -16,7 +15,6 @@ import { Usuario } from '../../../usuario/entity/usuario.entity';
.addSelect('iu.id_usuario', 'id_usuario')
.addSelect('ic.id_carrera', 'id_carrera')
.addSelect('ic.id_institucion', 'id_institucion')
.addSelect('u.correo', 'correo')
.addSelect('c.carrera', 'carrera')
.addSelect('i.institucion', 'institucion')
.from(InstitucionUsuario, 'iu')
@@ -25,7 +23,6 @@ import { Usuario } from '../../../usuario/entity/usuario.entity';
'ic',
'ic.id_institucion_carrera = iu.id_institucion_carrera',
)
.innerJoin(Usuario, 'u', 'u.id_usuario = iu.id_usuario')
.innerJoin(Carrera, 'c', 'c.id_carrera = ic.id_carrera')
.innerJoin(Institucion, 'i', 'i.id_institucion = ic.id_institucion'),
})
@@ -39,9 +36,6 @@ export class FullInformacionInstitucionUsuarioView {
@ViewColumn()
carrera: string;
@ViewColumn()
correo: string;
@ViewColumn()
institucion: string;
@@ -45,62 +45,47 @@ export class InstitucionUsuarioService {
});
}
// findInfoInstitucionUsuarioAllByIdUsuario(id_usuario: number) {
// return this.informacionInstitucionUsuarioView
// .find({ where: { id_usuario } })
// .then((infoInstitucionesUsuario) => {
// const institucionUsuarios: InstitucionUsuario[] = [];
findFullInfoInstitucionUsuarioAllByIdUsuarioIdInstitucion(
id_usuario: number,
id_institucion: number,
) {
return this.fullInformacionInstitucionUsuarioView
.find({ where: { id_institucion, id_usuario } })
.then((infoInstitucionesUsuario) => {
const institucionesUsuario: InstitucionUsuario[] = [];
// for (let i = 0; i < infoInstitucionesUsuario.length; i++)
// institucionUsuarios.push(
// this.repository.create({
// id_institucion_usuario:
// infoInstitucionesUsuario[i].id_institucion_usuario,
// activo: infoInstitucionesUsuario[i].activo === 1,
// multa: infoInstitucionesUsuario[i].multa === 1,
// institucionCarrera: {
// id_institucion_carrera:
// infoInstitucionesUsuario[i].id_institucion_carrera,
// carrera: { id_carrera: infoInstitucionesUsuario[i].id_carrera },
// institucion: {
// id_institucion: infoInstitucionesUsuario[i].id_institucion,
// },
// },
// }),
// );
// return institucionUsuarios;
// });
// }
findInfoInstitucionUsuarioById(id_institucion_usuario: number) {
return this.informacionInstitucionUsuarioView
.findOne({ where: { id_institucion_usuario } })
.then((infoInstitucionUsuario) => {
if (!infoInstitucionUsuario)
throw new ConflictException('No existe este id institución usuario.');
return this.repository.create({
id_institucion_usuario: infoInstitucionUsuario.id_institucion_usuario,
activo: infoInstitucionUsuario.activo === 1,
multa: infoInstitucionUsuario.multa === 1,
institucionCarrera: {
id_institucion_carrera:
infoInstitucionUsuario.id_institucion_carrera,
carrera: { id_carrera: infoInstitucionUsuario.id_carrera },
institucion: {
id_institucion: infoInstitucionUsuario.id_institucion,
},
},
});
for (let i = 0; i < infoInstitucionesUsuario.length; i++)
institucionesUsuario.push(
this.repository.create({
id_institucion_usuario:
infoInstitucionesUsuario[i].id_institucion_usuario,
activo: infoInstitucionesUsuario[i].activo === 1,
multa: infoInstitucionesUsuario[i].multa === 1,
institucionCarrera: {
id_institucion_carrera:
infoInstitucionesUsuario[i].id_institucion_carrera,
carrera: {
id_carrera: infoInstitucionesUsuario[i].id_carrera,
carrera: infoInstitucionesUsuario[i].carrera,
},
institucion: {
id_institucion: infoInstitucionesUsuario[i].id_institucion,
institucion: infoInstitucionesUsuario[i].institucion,
},
},
}),
);
return institucionesUsuario;
});
}
findFullInfoInstitucionUsuarioByUsuarioInstitucionCarrera(
id_usuario: number,
findFullInfoInstitucionUsuarioByIdUsuarioIdInstitucionCarrera(
usuario: Usuario,
id_institucion_carrera: number,
) {
return this.fullInformacionInstitucionUsuarioView
.findOne({
where: { id_institucion_carrera, id_usuario },
where: { id_institucion_carrera, id_usuario: usuario.id_usuario },
})
.then((infoInstitucionUsuario) => {
if (!infoInstitucionUsuario || infoInstitucionUsuario.activo === 0)
@@ -119,14 +104,32 @@ export class InstitucionUsuarioService {
id_institucion: infoInstitucionUsuario.id_institucion,
},
},
usuario: {
id_usuario: infoInstitucionUsuario.id_usuario,
correo: infoInstitucionUsuario.correo,
},
usuario,
});
});
}
findInfoInstitucionUsuarioByIdUsuarioIdInstitucionCarrera(
id_usuario: number,
id_institucion_carrera: number,
) {
return this.informacionInstitucionUsuarioView
.findOne({ where: { id_institucion_carrera, id_usuario } })
.then((infoInstitucionUsuario) =>
this.viewToInstitucionUsuario(infoInstitucionUsuario),
);
}
findInfoInstitucionUsuarioById(id_institucion_usuario: number) {
return this.informacionInstitucionUsuarioView
.findOne({ where: { id_institucion_usuario } })
.then((infoInstitucionUsuario) => {
if (!infoInstitucionUsuario)
throw new ConflictException('No existe este id institución usuario.');
return this.viewToInstitucionUsuario(infoInstitucionUsuario);
});
}
save(institucionUsuario: InstitucionUsuario) {
return this.repository.save(institucionUsuario);
}
@@ -154,4 +157,19 @@ export class InstitucionUsuarioService {
);
});
}
viewToInstitucionUsuario(
infoInstitucionUsuario: InformacionInstitucionUsuarioView,
) {
return this.repository.create({
id_institucion_usuario: infoInstitucionUsuario.id_institucion_usuario,
activo: infoInstitucionUsuario.activo === 1,
multa: infoInstitucionUsuario.multa === 1,
institucionCarrera: {
id_institucion_carrera: infoInstitucionUsuario.id_institucion_carrera,
carrera: { id_carrera: infoInstitucionUsuario.id_carrera },
institucion: { id_institucion: infoInstitucionUsuario.id_institucion },
},
});
}
}
+2 -2
View File
@@ -203,7 +203,7 @@ export class MultaService {
}
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
return this.usuarioService.findInfoUsuarioById(id_usuario).then((usuario) =>
this.fullInformacionMultaView
.findAndCount({
where: { id_usuario: usuario.id_usuario },
@@ -223,7 +223,7 @@ export class MultaService {
}
findMultasActivas(id_usuario: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
return this.usuarioService.findInfoUsuarioById(id_usuario).then((usuario) =>
this.repository
.createQueryBuilder('mu')
.innerJoin('mu.prestamo', 'p')
+1
View File
@@ -196,6 +196,7 @@ export class OperadorService {
select: {
id_operador: true,
activo: true,
correo : true,
institucion: { id_institucion: true },
tipoUsuario: { id_tipo_usuario: true },
},
+1 -1
View File
@@ -340,7 +340,7 @@ export class PrestamoService {
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService
.findById(id_usuario)
.findInfoUsuarioById(id_usuario)
.then((usuario) =>
this.fullInformacionPrestamoView.findAndCount({
where: { id_usuario: usuario.id_usuario },
+7 -12
View File
@@ -381,9 +381,8 @@ export class UploadFileService {
dataUsuario.tipo_usuario,
false,
);
const usuario = await this.usuarioService.findByUsuario(
const usuario = await this.usuarioService.findInfoUsuarioByUsuario(
dataUsuario.numero_cuenta,
false,
);
const carrera =
tipoUsuario && (tipoUsuario.id_tipo_usuario === 5 || dataUsuario.carrera)
@@ -417,16 +416,12 @@ export class UploadFileService {
return;
}
if (usuario) {
let existeInstitucionUsuario: InstitucionUsuario = null;
let existeInstitucionUsuario =
await this.institucionUsuarioService.findInfoInstitucionUsuarioByIdUsuarioIdInstitucionCarrera(
usuario.id_usuario,
institucionCarrera.id_institucion_carrera,
);
for (let i = 0; i < usuario.instituciones.length; i++)
if (
usuario.instituciones[i].institucionCarrera.id_institucion_carrera ===
institucionCarrera.id_institucion_carrera
) {
existeInstitucionUsuario = usuario.instituciones[i];
break;
}
if (existeInstitucionUsuario && !existeInstitucionUsuario.activo) {
existeInstitucionUsuario.activo = true;
await this.institucionUsuarioService.save(existeInstitucionUsuario);
@@ -443,7 +438,7 @@ export class UploadFileService {
if (dataUsuario.correo && usuario.correo != dataUsuario.correo)
usuario.correo = dataUsuario.correo;
await this.usuarioService
.update(usuario, false)
.save(usuario)
.then(({ message }) => mensajes.push(message));
}
} else {
@@ -0,0 +1,44 @@
import { DataSource, ViewEntity, ViewColumn } from 'typeorm';
import { TipoUsuario } from '../../../tipo-usuario/entity/tipo-usuario.entity';
import { Usuario } from '../usuario.entity';
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select('u.id_usuario', 'id_usuario')
.addSelect('u.correo', 'correo')
.addSelect('u.id_tipo_usuario', 'id_tipo_usuario')
.addSelect('u.nombre', 'nombre')
.addSelect('u.rfc', 'rfc')
.addSelect('u.telefono', 'telefono')
.addSelect('u.usuario', 'usuario')
.addSelect('tu.tipo_usuario', 'tipo_usuario')
.from(Usuario, 'u')
.innerJoin(TipoUsuario, 'tu', 'tu.id_tipo_usuario = u.id_tipo_usuario'),
})
export class FullInformacionUsuarioView {
@ViewColumn()
id_usuario: number;
@ViewColumn()
correo: string;
@ViewColumn()
id_tipo_usuario: number;
@ViewColumn()
nombre: string;
@ViewColumn()
rfc: string;
@ViewColumn()
telefono: string;
@ViewColumn()
tipo_usuario: string;
@ViewColumn()
usuario: string;
}
+9 -6
View File
@@ -77,10 +77,10 @@ export class UsuarioController {
},
})
update(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const admin: Operador = req.user.operador;
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(admin);
return this.usuarioService.update(body);
this.validarUsuarioService.validarAdminOperador(operador);
return this.usuarioService.update(operador, body);
}
@Put('update-password')
@@ -113,10 +113,13 @@ export class UsuarioController {
type: 'string',
})
usuario(@Request() req, @Query() query: UsuarioInputDto) {
const admin: Operador = req.user.operador;
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(admin);
return this.usuarioService.findByUsuario(query.usuario, true, true);
this.validarUsuarioService.validarAdminOperador(operador);
return this.usuarioService.findFullInfoUsuarioByUsuario(
operador,
query.usuario,
);
}
@Serealize(UsuariosOutputDto)
+6 -1
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 { FullInformacionUsuarioView } from './entity/views/full-informacion-usuario.view';
import { InformacionUsuarioView } from './entity/views/informacion-usuario.view';
import { BcryptModule } from '../bcrypt/bcrypt.module';
import { InstitucionModule } from '../institucion/institucion.module';
@@ -22,7 +23,11 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'
NodemailerModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
TipoUsuarioModule,
TypeOrmModule.forFeature([Usuario, InformacionUsuarioView]),
TypeOrmModule.forFeature([
Usuario,
FullInformacionUsuarioView,
InformacionUsuarioView,
]),
ValidarUsuarioModule,
],
controllers: [UsuarioController],
+83 -44
View File
@@ -4,10 +4,11 @@ import {
NotFoundException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { FindOptionsWhere, 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 { FullInformacionUsuarioView } from './entity/views/full-informacion-usuario.view';
import { InformacionUsuarioView } from './entity/views/informacion-usuario.view';
import { BcryptService } from '../bcrypt/bcrypt.service';
import { InstitucionService } from '../institucion/institucion.service';
@@ -15,6 +16,7 @@ import { InstitucionCarreraService } from '../institucion-carrera/institucion-ca
import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service';
import { NodemailerService } from '../nodemailer/nodemailer.service';
import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
import { Operador } from 'src/operador/entity/operador.entity';
@Injectable()
export class UsuarioService {
@@ -22,6 +24,8 @@ export class UsuarioService {
@InjectRepository(Usuario) private repository: Repository<Usuario>,
@InjectRepository(InformacionUsuarioView)
private informacionUsuarioView: Repository<InformacionUsuarioView>,
@InjectRepository(FullInformacionUsuarioView)
private fullInformacionUsuarioView: Repository<FullInformacionUsuarioView>,
private bcryptService: BcryptService,
private institucionService: InstitucionService,
private institucionCarreraService: InstitucionCarreraService,
@@ -38,6 +42,7 @@ export class UsuarioService {
correo: string,
rfc?: string,
) {
// Crear y gurdar registro
return this.repository
.save(
this.repository.create({
@@ -49,6 +54,7 @@ export class UsuarioService {
}),
)
.then((usuario) =>
// Le asigno la carrera enviada
this.institucionUsuarioService.create(institucionCarrera, usuario),
);
}
@@ -120,51 +126,71 @@ export class UsuarioService {
return query.getManyAndCount();
}
findById(id_usuario: number, validarNoExiste = true, password = false) {
findFullInfoUsuarioByUsuario(operador: Operador, usuario: string) {
return this.fullInformacionUsuarioView
.findOne({ where: { usuario } })
.then(async (infoUsuario) => {
if (!infoUsuario)
throw new NotFoundException('No existe este usuario.');
const instituciones =
await this.institucionUsuarioService.findFullInfoInstitucionUsuarioAllByIdUsuarioIdInstitucion(
infoUsuario.id_usuario,
operador.institucion.id_institucion,
);
if (instituciones.length === 0)
throw new ConflictException(
'Este usuario no pertenece a tu institución',
);
return this.repository.create({
id_usuario: infoUsuario.id_usuario,
correo: infoUsuario.correo,
telefono: infoUsuario.telefono,
nombre: infoUsuario.nombre,
rfc: infoUsuario.rfc,
usuario: infoUsuario.usuario,
tipoUsuario: {
id_tipo_usuario: infoUsuario.id_tipo_usuario,
tipo_usuario: infoUsuario.tipo_usuario,
},
instituciones,
});
});
}
findInfoUsuarioById(id_usuario: number) {
return this.repository
.findOne({
join: {
alias: 'u',
innerJoinAndSelect: {
is: 'u.instituciones',
ic: 'is.institucionCarrera',
c: 'ic.carrera',
i: 'ic.institucion',
n: 'c.nivel',
},
select: {
id_usuario: true,
correo: true,
password: true,
usuario: true,
nombre: true,
tipoUsuario: { id_tipo_usuario: true },
},
where: { id_usuario },
})
.then((usuario) => {
if (validarNoExiste && (!usuario || (password && !usuario.password)))
throw new NotFoundException('No existe este usuario.');
if (!usuario) throw new NotFoundException('No existe este usuario.');
return usuario;
});
}
async findByUsuario(
usuario: string,
validarNoExiste = true,
password = false,
institucionesActivas = false,
rfc?: string,
) {
const query = this.repository
.createQueryBuilder('u')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('u.tipoUsuario', 'tu')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.carrera', 'c')
.innerJoinAndSelect('ic.institucion', 'i')
.innerJoinAndSelect('c.nivel', 'n')
.where('usuario = :usuario', { usuario });
findInfoUsuarioByUsuario(usuario: string, rfc?: string) {
const busqueda: FindOptionsWhere<Usuario> = { usuario };
if (institucionesActivas) query.andWhere('is.activo = 1');
if (rfc) query.andWhere('rfc = :rfc', { rfc });
return query.getOne().then((usuario) => {
if (validarNoExiste && (!usuario || (password && !usuario.password)))
throw new NotFoundException('No existe este usuario.');
return usuario;
if (rfc) busqueda.rfc = rfc;
return this.repository.findOne({
select: {
id_usuario: true,
correo: true,
password: true,
usuario: true,
tipoUsuario: { id_tipo_usuario: true },
},
where: busqueda,
});
}
@@ -212,14 +238,23 @@ export class UsuarioService {
}
passwordReset(id_usuario: number) {
// Genero password
const password = this.bcryptService.generarPassword();
return this.findById(id_usuario, true, true)
return this.findInfoUsuarioById(id_usuario)
.then((usuario) => {
// Solo se puede actualizar password si no esta registrado, password = registro
if (!usuario.password)
throw new ConflictException(
'No se puede enviar una contraseña a un usuario no registrado.',
);
// Asigno nueva password
usuario.password = this.bcryptService.encriptar(password);
// Guardo
return this.repository.save(usuario);
})
.then((usuario) =>
// Envio correo con credenciales
this.nodemailerService.sendEmail({
email: usuario.correo,
subject: 'Credenciales Pc Puma',
@@ -243,14 +278,14 @@ export class UsuarioService {
const password = this.bcryptService.generarPassword();
let message: string;
return this.findByUsuario(usuario, false, false, false, rfc)
return this.findInfoUsuarioByUsuario(usuario, rfc)
.then(async (existeUsuario) => {
if (!existeUsuario || existeUsuario.password)
throw new ConflictException(
'Verificar sus datos, cualquier duda asistir al módulo PC PUMA.',
);
return this.institucionUsuarioService.findFullInfoInstitucionUsuarioByUsuarioInstitucionCarrera(
existeUsuario.id_usuario,
return this.institucionUsuarioService.findFullInfoInstitucionUsuarioByIdUsuarioIdInstitucionCarrera(
existeUsuario,
institucionCarrera.id_institucion_carrera,
);
})
@@ -280,14 +315,18 @@ export class UsuarioService {
.then((_) => ({ message }));
}
update(attrs: Partial<Usuario>, validarPassword = true) {
return this.findById(attrs.id_usuario, true, validarPassword)
save(usuario: Usuario) {
return this.repository
.save(usuario)
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
update(operador: Operador, attrs: Partial<Usuario>) {
return this.findInfoUsuarioById(attrs.id_usuario)
.then((usuario) => {
Object.assign(usuario, attrs);
return this.repository.save(usuario);
})
.then((_) => ({
message: 'Se guardaron los cambios correctamente.',
}));
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
}