From 94243e544e5ad70c06599c5ec7e8b42daa2f8db9 Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Sat, 6 Aug 2022 00:01:43 -0500 Subject: [PATCH] endpoint equipos validados por token --- src/equipo/dto/input/update.dto.ts | 8 --- src/equipo/equipo.controller.ts | 71 ++++++++++++++++++++++---- src/equipo/equipo.service.ts | 82 ++++++++++++++++-------------- 3 files changed, 105 insertions(+), 56 deletions(-) diff --git a/src/equipo/dto/input/update.dto.ts b/src/equipo/dto/input/update.dto.ts index 3083155..c829896 100644 --- a/src/equipo/dto/input/update.dto.ts +++ b/src/equipo/dto/input/update.dto.ts @@ -19,14 +19,6 @@ export class UpdateEquipoDto { @IsOptional() id_carrito?: number; - // @IsInt() - // @IsOptional() - // id_marca?: number; - - // @IsInt() - // @IsOptional() - // id_modelo?: number; - @IsInt() @IsOptional() id_operador?: number; diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index d1c6498..abdeb72 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -1,4 +1,13 @@ -import { Body, Controller, Get, Put, Query, UseGuards } from '@nestjs/common'; +import { + Body, + Controller, + ForbiddenException, + Get, + Put, + Query, + Request, + UseGuards, +} from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { ApiBearerAuth, @@ -9,6 +18,7 @@ import { } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { EquipoService } from './equipo.service'; +import { Operador } from 'src/operador/entity/operador.entity'; import { NumeroInventarioDto } from '../dto/numero-inventario.dto'; import { EquiposDto } from './dto/input/equipos.dto'; import { UpdateEquipoDto } from './dto/input/update.dto'; @@ -38,11 +48,33 @@ export class EquipoController { name: 'numero_inventario', type: 'string', }) - equipo(@Query() query: NumeroInventarioDto) { - return this.equipoService.findByNumeroInventario( - parseInt(query.id_institucion), - query.numero_inventario, - ); + equipo(@Request() req, @Query() query: NumeroInventarioDto) { + const operador: Operador = req.user.operador; + + if ( + !operador || + (operador.tipoUsuario.id_tipo_usuario != 3 && + operador.tipoUsuario.id_tipo_usuario != 4) + ) + throw new ForbiddenException( + 'No tienes los permisos necesarios para realizar esta acción.', + ); + return this.equipoService + .findByNumeroInventario( + parseInt(query.id_institucion), + query.numero_inventario, + ) + .then((equipo) => { + if ( + operador.tipoUsuario.id_tipo_usuario > 2 && + operador.institucion.id_institucion != + equipo.carrito.modulo.institucion.id_institucion + ) + throw new ForbiddenException( + 'No puedes acceder a esta información porque este equipo no pertenece a tu institución.', + ); + return equipo; + }); } @Serealize(EquiposOutputDto) @@ -124,8 +156,18 @@ export class EquipoController { type: 'string', required: false, }) - equipos(@Query() query: EquiposDto) { - return this.equipoService.findAll(query); + equipos(@Request() req, @Query() query: EquiposDto) { + const operador: Operador = req.user.operador; + + if ( + !operador || + (operador.tipoUsuario.id_tipo_usuario != 3 && + operador.tipoUsuario.id_tipo_usuario != 4) + ) + throw new ForbiddenException( + 'No tienes los permisos necesarios para realizar esta acción.', + ); + return this.equipoService.findAll(operador, query); } @Put() @@ -143,8 +185,6 @@ export class EquipoController { id_equipo: 1, _equipo: true, _id_carrito: '', - // _id_marca: '', - // _id_modelo: '', _id_operador: 1, _id_status: 1, _motivo: '', @@ -152,9 +192,18 @@ export class EquipoController { }, }, }) - update(@Body() body: UpdateEquipoDto) { + update(@Request() req, @Body() body: UpdateEquipoDto) { + const operador: Operador = req.user.operador; const data = { ...body }; + if ( + !operador || + (operador.tipoUsuario.id_tipo_usuario != 3 && + operador.tipoUsuario.id_tipo_usuario != 4) + ) + throw new ForbiddenException( + 'No tienes los permisos necesarios para realizar esta acción.', + ); delete data.id_carrito; delete data.id_status; delete data.id_operador; diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index c4cb886..5ba3a8e 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -1,5 +1,6 @@ import { ConflictException, + ForbiddenException, forwardRef, Inject, Injectable, @@ -76,20 +77,23 @@ export class EquipoService { .then((_) => equipoNuevo); } - async findAll(filtros: { - pagina: string; - carrito?: string; - equipo?: string; - id_carrito?: string; - id_institucion?: string; - id_marca?: string; - id_modelo?: string; - id_modulo?: string; - id_programa?: string; - id_status?: string; - id_tipo_carrito?: string; - id_tipo_entrada?: string; - }) { + async findAll( + operador: Operador, + filtros: { + pagina: string; + carrito?: string; + equipo?: string; + id_carrito?: string; + id_institucion?: string; + id_marca?: string; + id_modelo?: string; + id_modulo?: string; + id_programa?: string; + id_status?: string; + id_tipo_carrito?: string; + id_tipo_entrada?: string; + }, + ) { const carrito = filtros.id_carrito ? await this.carritoService.findById(parseInt(filtros.id_carrito)) : null; @@ -144,6 +148,31 @@ export class EquipoService { .take(15) .skip((parseInt(filtros.pagina) - 1) * 15); + if (modulo) { + if ( + operador.tipoUsuario.id_tipo_usuario > 2 && + operador.institucion.id_institucion != modulo.institucion.id_institucion + ) + throw new ForbiddenException( + 'No puedes acceder a esta información porque este módulo no pertenece a tu institución.', + ); + query.andWhere('m.id_modulo = :id_modulo', { + id_modulo: modulo.id_modulo, + }); + } + if (carrito) { + if ( + operador.tipoUsuario.id_tipo_usuario > 2 && + operador.institucion.id_institucion != + carrito.modulo.institucion.id_institucion + ) + throw new ForbiddenException( + 'No puedes acceder a esta información porque este carrito no pertenece a tu institución.', + ); + query.andWhere('c.id_carrito = :id_carrito', { + id_carrito: carrito.id_carrito, + }); + } if (filtros.carrito) query.andWhere('c.carrito LIKE :carrito', { carrito: `%${filtros.carrito}%`, @@ -152,7 +181,7 @@ export class EquipoService { query.andWhere('e.equipo LIKE :equipo', { equipo: `%${filtros.equipo}%`, }); - if (institucion) + if (institucion && operador.tipoUsuario.id_tipo_usuario === 2) query.andWhere('m.id_institucion = :id_institucion', { id_institucion: institucion.id_institucion, }); @@ -164,14 +193,6 @@ export class EquipoService { query.andWhere('mo.id_modelo = :id_modelo', { id_modelo: modelo.id_modelo, }); - if (modulo) - query.andWhere('m.id_modulo = :id_modulo', { - id_modulo: modulo.id_modulo, - }); - if (carrito) - query.andWhere('c.id_carrito = :id_carrito', { - id_carrito: carrito.id_carrito, - }); if (programa) query.andWhere('ps.id_programa = :id_programa', { id_programa: programa.id_programa, @@ -337,11 +358,10 @@ export class EquipoService { } async update( + // operador: Operador, attrs: Partial, id_carrito?: number, id_status?: number, - // id_marca?: number, - // id_modelo?: number, id_operador?: number | Operador, motivo?: string, ) { @@ -353,16 +373,6 @@ export class EquipoService { ? await this.operadorService.findById(id_operador) : id_operador : null; - // const marca = id_marca - // ? typeof id_marca === 'number' - // ? await this.marcaService.findById(id_marca) - // : id_marca - // : null; - // const operador = id_operador - // ? typeof id_operador === 'number' - // ? await this.operadorService.findById(id_operador) - // : id_operador - // : null; const status = id_status ? await this.statusService.findById(id_status) : null; @@ -402,8 +412,6 @@ export class EquipoService { equipo.status = status; } if (carrito) equipo.carrito = carrito; - // if (marca) equipo.marca = marca; - // if (modelo) equipo.modelo = modelo; return this.repository.save(equipo); }) .then((equipo) => ({