diff --git a/src/institucion-usuario/dto/input/update.dto.ts b/src/institucion-usuario/dto/input/update.dto.ts index e3b8b56..0db1f27 100644 --- a/src/institucion-usuario/dto/input/update.dto.ts +++ b/src/institucion-usuario/dto/input/update.dto.ts @@ -1,10 +1,9 @@ -import { IsBoolean, IsInt, IsOptional } from 'class-validator'; +import { IsBoolean, IsInt } from 'class-validator'; export class UpdateInstitucionUsuarioInputDto { @IsInt() id_institucion_usuario: number; @IsBoolean() - @IsOptional() activo: boolean; } diff --git a/src/institucion-usuario/dto/output/institucion-usuario-min.dto.ts b/src/institucion-usuario/dto/output/institucion-usuario-min.dto.ts new file mode 100644 index 0000000..14667f2 --- /dev/null +++ b/src/institucion-usuario/dto/output/institucion-usuario-min.dto.ts @@ -0,0 +1,11 @@ +import { Expose, Type } from 'class-transformer'; +import { InstitucionCarreaOutputDto } from '../../../institucion-carrera/dto/output/institucion-carrera.dto'; + +export class InstitucionUsuarioMinOutputDto { + @Expose() + id_institucion_usuario; + + @Expose() + @Type(() => InstitucionCarreaOutputDto) + institucionCarrera; +} diff --git a/src/institucion-usuario/institucion-usuario.controller.ts b/src/institucion-usuario/institucion-usuario.controller.ts index e461be7..dfcfaca 100644 --- a/src/institucion-usuario/institucion-usuario.controller.ts +++ b/src/institucion-usuario/institucion-usuario.controller.ts @@ -1,12 +1,14 @@ -import { Body, Controller, Put, Request, UseGuards } from '@nestjs/common'; +import { Body, Controller, Get, Put, Request, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { InstitucionUsuarioService } from './institucion-usuario.service'; import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service'; import { Operador } from '../operador/entity/operador.entity'; +import { Usuario } from 'src/usuario/entity/usuario.entity'; import { UpdateInstitucionUsuarioInputDto } from './dto/input/update.dto'; import { MessageOutputDto } from '../dto/output/message.dto'; +import { InstitucionUsuarioMinOutputDto } from './dto/output/institucion-usuario-min.dto'; @Controller('institucion-usuario') @ApiTags('institucion-usuario') @@ -16,6 +18,21 @@ export class InstitucionUsuarioController { private validarUsuarioService: ValidarUsuarioService, ) {} + @Serealize(InstitucionUsuarioMinOutputDto) + @Get() + @UseGuards(AuthGuard('jwt')) + @ApiOperation({ + description: + 'Enpoint que obtiene todas las asociaciones entre un alumno y una institución y su carra que esten activas.', + }) + @ApiBearerAuth('jwt') + get(@Request() req) { + const usuario: Usuario = req.user.usuario; + + this.validarUsuarioService.validarUsuario(usuario); + return this.institucionUsuarioService.findFullInfoAllByUsuario(usuario); + } + @Serealize(MessageOutputDto) @Put('desactivar-cuentas') @UseGuards(AuthGuard('jwt')) diff --git a/src/institucion-usuario/institucion-usuario.service.ts b/src/institucion-usuario/institucion-usuario.service.ts index b8afbc2..0b3e3a2 100644 --- a/src/institucion-usuario/institucion-usuario.service.ts +++ b/src/institucion-usuario/institucion-usuario.service.ts @@ -21,6 +21,7 @@ export class InstitucionUsuarioService { ) {} create(institucionCarrera: InstitucionCarrera, usuario: Usuario) { + // Creo y guardo el registro return this.repository .save(this.repository.create({ institucionCarrera, usuario })) .then((institucionUsuario) => ({ @@ -30,11 +31,14 @@ export class InstitucionUsuarioService { } desactivarCuentas(admin: Operador) { + // Busco todas los registros que le pertenecen a la institutción del operador + // que esta realizando esta acción return this.informacionInstitucionUsuarioView .find({ - where: { id_institucion: admin.institucion.id_institucion }, + where: { id_institucion: admin.institucion.id_institucion, activo: 1 }, }) .then(async (infoInstitucionesUsuario) => { + // Desactivo todos los registros que cumplen con las condiciones for (let i = 0; i < infoInstitucionesUsuario.length; i++) await this.repository.save( this.repository.create({ @@ -43,8 +47,8 @@ export class InstitucionUsuarioService { activo: false, }), ); - }) - .then((_) => ({ message: 'Se desactivaron todas las cuentas.' })); + return { message: 'Se desactivaron todas las cuentas.' }; + }); } findAllByIdUsuarioIdInstitucion(id_usuario: number, id_institucion: number) { @@ -72,24 +76,21 @@ export class InstitucionUsuarioService { 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, - }, - }, - }), + this.fullViewToInstitucionUsuario(infoInstitucionesUsuario[i]), + ); + return institucionesUsuario; + }); + } + + findFullInfoAllByUsuario(usuario: Usuario) { + return this.fullInformacionInstitucionUsuarioView + .find({ where: { id_usuario: usuario.id_usuario, activo: 1, multa: 0 } }) + .then((infoInstitucionesUsuario) => { + const institucionesUsuario: InstitucionUsuario[] = []; + + for (let i = 0; i < infoInstitucionesUsuario.length; i++) + institucionesUsuario.push( + this.fullViewToInstitucionUsuario(infoInstitucionesUsuario[i]), ); return institucionesUsuario; }); @@ -166,17 +167,21 @@ export class InstitucionUsuarioService { update(attrs: Partial) { return this.findById(attrs.id_institucion_usuario) .then((institucionUsuario) => { + // Asigno valores enviados al objeto Object.assign(institucionUsuario, attrs); + // Guardar return this.repository.save(institucionUsuario); }) .then((_) => ({ message: 'Se guardaron los cambios correctamente.' })); } updateMulta(id_institucion: number, id_usuario: number, status: boolean) { + // Busca todas las carreras del usuario en la institución enviada return this.findAllByIdUsuarioIdInstitucion( id_usuario, id_institucion, ).then(async (institucionesUsuario) => { + // desactiva o activa dependinedo el caso for (let i = 0; i < institucionesUsuario.length; i++) { institucionesUsuario[i].multa = status; await this.repository.save(institucionesUsuario[i]); @@ -198,4 +203,25 @@ export class InstitucionUsuarioService { }, }); } + + fullViewToInstitucionUsuario( + infoInstitucionUsuario: FullInformacionInstitucionUsuarioView, + ) { + 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, + carrera: infoInstitucionUsuario.carrera, + }, + institucion: { + id_institucion: infoInstitucionUsuario.id_institucion, + institucion: infoInstitucionUsuario.institucion, + }, + }, + }); + } }