diff --git a/src/app.module.ts b/src/app.module.ts index a3b0551..c30e05f 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -76,6 +76,7 @@ import { InformacionEquipoView } from './equipo/entity/views/informacion-equipo. import { InformacionEquipoProgramaView } from './equipo-programa/entity/views/informacion-equipo-programa.view'; import { InformacionEquipoTipoEntradaView } from './equipo-tipo-entrada/entity/views/informacion-equipo-tipo-entrada.view'; import { InformacionInstitucionView } from './institucion/entity/views/informacion-institucion.view'; +import { InformacionModuloView } from './modulo/entity/views/informacion-modulo.view'; import { FullInformacionMultaView } from './multa/entity/views/full-informacion-multa.view'; import { InformacionMultaView } from './multa/entity/views/informacion-multa.view'; import { InformacionOperadorView } from './operador/entity/views/informacion-operador.view'; @@ -146,6 +147,7 @@ import { InformacionUsuarioView } from './usuario/entity/views/informacion-usuar InformacionEquipoProgramaView, InformacionEquipoTipoEntradaView, InformacionInstitucionView, + InformacionModuloView, FullInformacionMultaView, InformacionMultaView, InformacionOperadorView, diff --git a/src/institucion/institucion.service.ts b/src/institucion/institucion.service.ts index 25e5a99..d7b515a 100644 --- a/src/institucion/institucion.service.ts +++ b/src/institucion/institucion.service.ts @@ -40,11 +40,11 @@ export class InstitucionService { findInfoInstitucionById(id_institucion: number) { return this.informacionInstitucionView .findOne({ where: { id_institucion } }) - .then((institucion) => { - if (!institucion) + .then((infoInstitucion) => { + if (!infoInstitucion) throw new NotFoundException('No existe este id institución.'); return this.repository.create({ - id_institucion: institucion.id_institucion, + id_institucion: infoInstitucion.id_institucion, }); }); } @@ -56,21 +56,21 @@ export class InstitucionService { if (responsable) busqueda.responsable = Not(IsNull()); return this.informacionInstitucionView .find({ where: busqueda, order: { institucion: 'ASC' } }) - .then((instituciones) => { - const data: Institucion[] = []; + .then((infoInstituciones) => { + const instituciones: Institucion[] = []; - for (let i = 0; i < instituciones.length; i++) - data.push( + for (let i = 0; i < infoInstituciones.length; i++) + instituciones.push( this.repository.create({ - id_institucion: instituciones[i].id_institucion, - activo: instituciones[i].activo === 1, - correo: instituciones[i].correo, - dominio: instituciones[i].dominio, - institucion: instituciones[i].institucion, - responsable: instituciones[i].responsable, + id_institucion: infoInstituciones[i].id_institucion, + activo: infoInstituciones[i].activo === 1, + correo: infoInstituciones[i].correo, + dominio: infoInstituciones[i].dominio, + institucion: infoInstituciones[i].institucion, + responsable: infoInstituciones[i].responsable, }), ); - return data; + return instituciones; }); } diff --git a/src/modulo/entity/views/informacion-modulo.view.ts b/src/modulo/entity/views/informacion-modulo.view.ts new file mode 100644 index 0000000..f0f02a9 --- /dev/null +++ b/src/modulo/entity/views/informacion-modulo.view.ts @@ -0,0 +1,32 @@ +import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; +import { Modulo } from '../modulo.entity'; +import { Institucion } from '../../../institucion/entity/institucion.entity'; + +@ViewEntity({ + expression: (dataSource: DataSource) => + dataSource + .createQueryBuilder() + .select('m.id_modulo', 'id_modulo') + .addSelect('m.activo', 'activo') + .addSelect('m.modulo', 'modulo') + .addSelect('m.id_institucion', 'id_institucion') + .addSelect('i.institucion', 'institucion') + .from(Modulo, 'm') + .innerJoin(Institucion, 'i', 'i.id_institucion = m.id_institucion'), +}) +export class InformacionModuloView { + @ViewColumn() + id_modulo: number; + + @ViewColumn() + activo: number; + + @ViewColumn() + id_institucion: number; + + @ViewColumn() + institucion: string; + + @ViewColumn() + modulo: string; +} diff --git a/src/modulo/modulo.controller.ts b/src/modulo/modulo.controller.ts index c81195a..fec9f21 100644 --- a/src/modulo/modulo.controller.ts +++ b/src/modulo/modulo.controller.ts @@ -1,6 +1,7 @@ import { Body, Controller, + ForbiddenException, Get, Post, Put, @@ -66,7 +67,18 @@ export class ModuloController { const admin: Operador = req.user.operador; this.validarUsuarioService.validarAdmin(admin); - return this.moduloService.findById(parseInt(query.id_modulo)); + return this.moduloService + .findInfoModuloById(parseInt(query.id_modulo)) + .then((modulo) => { + if ( + admin.tipoUsuario.id_tipo_usuario === 3 && + admin.institucion.id_institucion != modulo.institucion.id_institucion + ) + throw new ForbiddenException( + 'No puedes acceder a esta información porque no le pertenece a tu institución.', + ); + return modulo; + }); } @Serealize(ModuloOutputDto) @@ -85,9 +97,7 @@ export class ModuloController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarOperador(operador); - return this.moduloService.findAllByIdInstitucion( - parseInt(query.id_institucion), - ); + return this.moduloService.findInfoModuloAll(parseInt(query.id_institucion)); } @Serealize(ModuloMinOutputDto) @@ -101,9 +111,9 @@ export class ModuloController { type: 'string', }) modulosActivos(@Query() query: IdInstitucionDto) { - return this.moduloService.findAllByIdInstitucion( + return this.moduloService.findInfoModuloAll( parseInt(query.id_institucion), - true, + 1, ); } diff --git a/src/modulo/modulo.module.ts b/src/modulo/modulo.module.ts index 2e74289..311bd4e 100644 --- a/src/modulo/modulo.module.ts +++ b/src/modulo/modulo.module.ts @@ -4,6 +4,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { ModuloController } from './modulo.controller'; import { ModuloService } from './modulo.service'; import { Modulo } from './entity/modulo.entity'; +import { InformacionModuloView } from './entity/views/informacion-modulo.view'; import { InstitucionModule } from '../institucion/institucion.module'; import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'; @@ -11,7 +12,7 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module' imports: [ InstitucionModule, PassportModule.register({ defaultStrategy: 'jwt' }), - TypeOrmModule.forFeature([Modulo]), + TypeOrmModule.forFeature([Modulo, InformacionModuloView]), ValidarUsuarioModule, ], controllers: [ModuloController], diff --git a/src/modulo/modulo.service.ts b/src/modulo/modulo.service.ts index 3353d5d..16d6d61 100644 --- a/src/modulo/modulo.service.ts +++ b/src/modulo/modulo.service.ts @@ -7,6 +7,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Institucion } from '../institucion/entity/institucion.entity'; import { Modulo } from './entity/modulo.entity'; +import { InformacionModuloView } from './entity/views/informacion-modulo.view'; import { Operador } from '../operador/entity/operador.entity'; import { InstitucionService } from '../institucion/institucion.service'; @@ -14,6 +15,8 @@ import { InstitucionService } from '../institucion/institucion.service'; export class ModuloService { constructor( @InjectRepository(Modulo) private repository: Repository, + @InjectRepository(InformacionModuloView) + private informacionModuloView: Repository, private institucionService: InstitucionService, ) {} @@ -35,36 +38,19 @@ export class ModuloService { async existeModulo(id_institucion: number | Institucion, modulo: string) { const institucion = typeof id_institucion === 'number' - ? await this.institucionService.findById(id_institucion) + ? await this.institucionService.findInfoInstitucionById(id_institucion) : id_institucion; - return this.repository - .findOne({ where: { institucion, modulo } }) + return this.informacionModuloView + .findOne({ + where: { id_institucion: institucion.id_institucion, modulo }, + }) .then((existeModulo) => { if (existeModulo) throw new ConflictException( 'Ya existe un módulo en esta institución con este nombre, intente con otro nombre.', ); - }); - } - - findAllByIdInstitucion(id_institucion: number, activos = false) { - return this.institucionService - .findById(id_institucion) - .then((institucion) => { - const query = this.repository - .createQueryBuilder('m') - .innerJoinAndSelect( - 'm.institucion', - 'i', - 'i.id_institucion = :id_institucion', - { id_institucion: institucion.id_institucion }, - ) - .orderBy('i.institucion') - .orderBy('m.modulo'); - - if (activos) query.andWhere('m.activo = 1'); - return query.getMany(); + return; }); } @@ -82,7 +68,7 @@ export class ModuloService { ) { const institucion = typeof id_institucion === 'number' - ? await this.institucionService.findById(id_institucion) + ? await this.institucionService.findInfoInstitucionById(id_institucion) : id_institucion; return this.repository @@ -94,8 +80,59 @@ export class ModuloService { }); } + findInfoModuloById(id_modulo: number) { + return this.informacionModuloView + .findOne({ where: { id_modulo } }) + .then((infoModulo) => { + if (!infoModulo) + throw new NotFoundException('No existe este id módulo.'); + return this.repository.create({ + id_modulo: infoModulo.id_modulo, + activo: infoModulo.activo === 1, + modulo: infoModulo.modulo, + institucion: { + id_institucion: infoModulo.id_institucion, + institucion: infoModulo.institucion, + }, + }); + }); + } + + async findInfoModuloAll(id_institucion: number, activo = 0) { + return this.institucionService + .findInfoInstitucionById(id_institucion) + .then((institucion) => { + const busqueda: { id_institucion: number; activo?: number } = { + id_institucion: institucion.id_institucion, + }; + + if (activo) busqueda.activo = activo; + return this.informacionModuloView.find({ + where: busqueda, + order: { modulo: 'ASC' }, + }); + }) + .then((infoModulos) => { + const modulos: Modulo[] = []; + + for (let i = 0; i < infoModulos.length; i++) + modulos.push( + this.repository.create({ + id_modulo: infoModulos[i].id_modulo, + activo: infoModulos[i].activo === 1, + modulo: infoModulos[i].modulo, + institucion: { + id_institucion: infoModulos[i].id_institucion, + institucion: infoModulos[i].institucion, + }, + }), + ); + return modulos; + }); + } + update(admin: Operador, attrs: Partial) { - return this.findById(attrs.id_modulo) + return this.findInfoModuloById(attrs.id_modulo) .then(async (modulo) => { if ( admin.institucion.id_institucion != modulo.institucion.id_institucion