diff --git a/src/carrera-programa/carrera-programa.controller.ts b/src/carrera-programa/carrera-programa.controller.ts index 3cc00cf..ab3a8b5 100644 --- a/src/carrera-programa/carrera-programa.controller.ts +++ b/src/carrera-programa/carrera-programa.controller.ts @@ -79,7 +79,23 @@ export class CarreraProgramaController { @Get() @UseGuards(AuthGuard('jwt')) @ApiOperation({ - description: 'Programas asignados a las carreras de una institución.', + description: + 'Programas asignados a las carreras de una institución de un admin.', + }) + @ApiBearerAuth('jwt') + get(@Request() req) { + const admin: Operador = req.user.operador; + + this.validarUsuarioService.validarAdmin(admin); + return this.carreraProgramaService.findAllByInstitucion(admin.institucion); + } + + @Serealize(CarreraProgramaOutputDto) + @Get('usuario') + @UseGuards(AuthGuard('jwt')) + @ApiOperation({ + description: + 'Programas asignados a las carreras de una institución de un usuario.', }) @ApiBearerAuth('jwt') @ApiQuery({ @@ -87,15 +103,12 @@ export class CarreraProgramaController { name: 'id_institucion', type: 'string', }) - get(@Request() req, @Query() query: IdInstitucionDto) { - const usuarioOperador: Operador | Usuario = - req.user.operador || req.user.usuario; + getUsuario(@Request() req, @Query() query: IdInstitucionDto) { + const usuario: Usuario = req.user.usuario; - if (usuarioOperador instanceof Usuario) - this.validarUsuarioService.validarUsuario(usuarioOperador); - else this.validarUsuarioService.validarAdmin(usuarioOperador); - return this.carreraProgramaService.findByIdInstitucion( - usuarioOperador, + this.validarUsuarioService.validarUsuario(usuario); + return this.carreraProgramaService.findAllOfUsuario( + usuario, parseInt(query.id_institucion), ); } diff --git a/src/carrera-programa/carrera-programa.service.ts b/src/carrera-programa/carrera-programa.service.ts index dc90b98..cc04311 100644 --- a/src/carrera-programa/carrera-programa.service.ts +++ b/src/carrera-programa/carrera-programa.service.ts @@ -7,6 +7,7 @@ import { import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { CarreraPrograma } from './entity/carrera-programa.entity'; +import { Institucion } from '../institucion/entity/institucion.entity'; import { Operador } from '../operador/entity/operador.entity'; import { Usuario } from '../usuario/entity/usuario.entity'; import { InstitucionService } from '../institucion/institucion.service'; @@ -29,7 +30,7 @@ export class CarreraProgramaService { admin: Operador, id_institucion_carrera: number, id_programa: number, - ) { + ): Promise<{ message: string }> { const institucionCarrera = await this.institucionCarreraService.findById( id_institucion_carrera, ); @@ -37,7 +38,7 @@ export class CarreraProgramaService { id_programa, ); - // Validamos que el admin que esta realizando esta acción le pertenezca la carrera + // Validamos que la institución carrera le pertenezca al admin if ( admin.institucion.id_institucion != institucionCarrera.institucion.id_institucion @@ -45,24 +46,21 @@ export class CarreraProgramaService { throw new ForbiddenException( 'Esta carrera no pertenece a tu institución.', ); - // Busco un registro que ya contenga la info mandada + // Busco un registro con los datos mandados del client return this.repository .findOne({ - select: { id_carrera_programa: true }, + select: ['id_carrera_programa'], where: { institucionCarrera, programa }, }) .then((existeCarretaPrograma) => { - // Si lo encuentro saco error + // Si encuentro uno saco error if (existeCarretaPrograma) throw new ConflictException( 'Ya se asignó este programa a esta carrera.', ); - // Guardar registro + // Creo y guardo registro return this.repository.save( - this.repository.create({ - institucionCarrera, - programa, - }), + this.repository.create({ institucionCarrera, programa }), ); }) .then((_) => ({ @@ -70,11 +68,13 @@ export class CarreraProgramaService { })); } - delete(admin: Operador, id_carrera_programa: number) { + delete( + admin: Operador, + id_carrera_programa: number, + ): Promise<{ message: string }> { return this.findById(id_carrera_programa) .then((carreraPrograma) => { - // Validamos que la asociación entre una carrera y un programa le - // pertenezcan al admin que realiza esta acción + // Validamos que la carrera programa pertenezca a la institución del admin if ( admin.institucion.id_institucion != carreraPrograma.institucionCarrera.institucion.id_institucion @@ -82,17 +82,32 @@ export class CarreraProgramaService { throw new ForbiddenException( 'No puedes eliminar esta asociación porque no pertenece a tu institución.', ); - // Elimino + // Eliminamos el registro return this.repository.remove(carreraPrograma); }) - .then((_) => ({ - message: 'Se eliminó correctamente la asignación del programa.', - })); + .then((_) => ({ message: 'Se eliminó correctamente esta asociación.' })); } - findById(id_carrera_programa: number) { + findAllByInstitucion(institucion: Institucion): Promise { + return this.repository.find({ + join: { + alias: 'cp', + innerJoinAndSelect: { + ic: 'cp.institucionCarrera', + c: 'ic.carrera', + i: 'ic.institucion', + }, + }, + where: { institucionCarrera: { institucion } }, + }); + } + + findById(id_carrera_programa: number): Promise { return this.repository - .findOne({ where: { id_carrera_programa } }) + .findOne({ + select: ['id_carrera_programa'], + where: { id_carrera_programa }, + }) .then((carreraPrograma) => { if (!carreraPrograma) throw new NotFoundException('No existe este id carrera programa.'); @@ -100,43 +115,21 @@ export class CarreraProgramaService { }); } - findByIdInstitucion( - usuarioOperador: Operador | Usuario, + async findAllOfUsuario( + usuario: Usuario, id_institucion: number, - ) { - return this.institucionService - .findById(id_institucion) - .then(async (institucion) => { - // Si es un Operador - if (usuarioOperador instanceof Operador) { - // Validamos que la info le pertenezca al operador que la solicita - if ( - usuarioOperador.institucion.id_institucion != - institucion.id_institucion - ) - throw new ForbiddenException( - 'No puedes acceder a esta información porque no le pertenece a tu institución.', - ); - } else - await this.institucionUsuarioService - .findByIdUsuarioIdInstitucion(usuarioOperador, institucion) - .then((institucionUsuario) => { - if (!institucionUsuario) - throw new ForbiddenException( - 'No puedes acceder a esta información porque no perteneces a esta institución.', - ); - }); - return this.repository.find({ - join: { - alias: 'cp', - innerJoinAndSelect: { - ic: 'cp.institucionCarrera', - c: 'ic.carrera', - i: 'ic.institucion', - }, - }, - where: { institucionCarrera: { institucion } }, - }); + ): Promise { + const institucion = await this.institucionService.findById(id_institucion); + + return this.institucionUsuarioService + .findByIdUsuarioIdInstitucion(usuario, institucion) + .then((institucionUsuario) => { + // Validamos que el usuario pertenezca a la institución de la información que solicita + if (!institucionUsuario) + throw new ForbiddenException( + 'No puedes acceder a esta información porque no perteneces a esta institución.', + ); + return this.findAllByInstitucion(institucion); }); } } diff --git a/src/hora-excepcion/hora-excepcion.service.ts b/src/hora-excepcion/hora-excepcion.service.ts index eadbe61..5213007 100644 --- a/src/hora-excepcion/hora-excepcion.service.ts +++ b/src/hora-excepcion/hora-excepcion.service.ts @@ -97,7 +97,7 @@ export class HoraExcepcionService { throw new ConflictException( 'No puedes eliminar esta horario sin servicio porque no pertenece a tu institución.', ); - // Elimino registro + // Eliminamos registro return this.repository.remove(horaExcepcion); }) .then((_) => ({ diff --git a/src/operador/operador.service.ts b/src/operador/operador.service.ts index 7917fe8..3d8c224 100644 --- a/src/operador/operador.service.ts +++ b/src/operador/operador.service.ts @@ -100,15 +100,15 @@ export class OperadorService { findAdmin(admin: string) { return this.repository .findOne({ - select: { - id_operador: true, - activo: true, - nombre: true, - operador: true, - password: true, - id_institucion: true, - id_tipo_usuario: true, - }, + select: [ + 'id_operador', + 'activo', + 'nombre', + 'operador', + 'password', + 'id_institucion', + 'id_tipo_usuario', + ], where: { operador: admin, tipoUsuario: { id_tipo_usuario: Between(2, 3) }, @@ -179,15 +179,15 @@ export class OperadorService { findOperador(institucion: Institucion, operador: string) { return this.repository .findOne({ - select: { - id_operador: true, - activo: true, - nombre: true, - operador: true, - password: true, - id_institucion: true, - id_tipo_usuario: true, - }, + select: [ + 'id_operador', + 'activo', + 'nombre', + 'operador', + 'password', + 'id_institucion', + 'id_tipo_usuario', + ], where: { operador, institucion, tipoUsuario: { id_tipo_usuario: 4 } }, }) .then((operador) => this.llenarIds(operador)); @@ -196,13 +196,13 @@ export class OperadorService { findById(id_operador: number) { return this.repository .findOne({ - select: { - id_operador: true, - activo: true, - correo: true, - id_institucion: true, - id_tipo_usuario: true, - }, + select: [ + 'id_operador', + 'activo', + 'correo', + 'id_institucion', + 'id_tipo_usuario', + ], where: { id_operador }, }) .then((operador) => { diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts index 2ec08a4..da219fc 100644 --- a/src/usuario/usuario.service.ts +++ b/src/usuario/usuario.service.ts @@ -158,14 +158,7 @@ export class UsuarioService { findById(id_usuario: number) { return this.repository .findOne({ - select: { - id_usuario: true, - correo: true, - password: true, - usuario: true, - nombre: true, - tipoUsuario: { id_tipo_usuario: true }, - }, + select: ['id_usuario', 'correo', 'password', 'usuario', 'nombre'], where: { id_usuario }, }) .then((usuario) => { @@ -179,14 +172,7 @@ export class UsuarioService { if (rfc) busqueda.rfc = rfc; return this.repository.findOne({ - select: { - id_usuario: true, - correo: true, - nombre: true, - password: true, - usuario: true, - tipoUsuario: { id_tipo_usuario: true }, - }, + select: ['id_usuario', 'correo', 'nombre', 'password', 'usuario'], where: busqueda, }); }