From 4b39c19884ecf530fff7a7af5467edb5d0c040b0 Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Fri, 5 Aug 2022 23:25:41 -0500 Subject: [PATCH] endpoint carritos validados por token --- .../carrera-programa.service.ts | 4 +- src/carrito/carrito.controller.ts | 66 +++++++++++++++-- src/carrito/carrito.service.ts | 74 ++++++++++--------- 3 files changed, 102 insertions(+), 42 deletions(-) diff --git a/src/carrera-programa/carrera-programa.service.ts b/src/carrera-programa/carrera-programa.service.ts index 377e3ef..307ff81 100644 --- a/src/carrera-programa/carrera-programa.service.ts +++ b/src/carrera-programa/carrera-programa.service.ts @@ -101,7 +101,7 @@ export class CarreraProgramaService { institucion.id_institucion ) throw new ForbiddenException( - 'No puedes acceder a esta información porque no te pertenece.', + 'No puedes acceder a esta información porque no perteneces a esta institución.', ); } else { let lePertenece = false; @@ -116,7 +116,7 @@ export class CarreraProgramaService { } if (!lePertenece) throw new ForbiddenException( - 'No puedes acceder a esta información porque no te pertenece.', + 'No puedes acceder a esta información porque no perteneces a esta institución.', ); } return this.repository.find({ diff --git a/src/carrito/carrito.controller.ts b/src/carrito/carrito.controller.ts index 089bdb3..529b672 100644 --- a/src/carrito/carrito.controller.ts +++ b/src/carrito/carrito.controller.ts @@ -1,10 +1,12 @@ import { Body, Controller, + ForbiddenException, Get, Post, Put, Query, + Request, UseGuards, } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; @@ -15,6 +17,7 @@ import { ApiQuery, ApiTags, } from '@nestjs/swagger'; +import { Operador } from 'src/operador/entity/operador.entity'; import { Serealize } from '../interceptors/serialize.interceptor'; import { CarritoService } from './carrito.service'; import { CarritoDto } from './dto/input/carrito.dto'; @@ -41,8 +44,30 @@ export class CarritoController { name: 'id_carrito', type: 'string', }) - carrito(@Query() query: CarritoDto) { - return this.carritoService.findById(parseInt(query.id_carrito)); + carrito(@Request() req, @Query() query: CarritoDto) { + 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 acceder a esta información.', + ); + return this.carritoService + .findById(parseInt(query.id_carrito)) + .then((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.', + ); + return carrito; + }); } @Serealize(CarritosOutputDto) @@ -100,8 +125,18 @@ export class CarritoController { type: 'string', required: false, }) - carritos(@Query() query: CarritosDto) { - return this.carritoService.findAll(query); + carritos(@Request() req, @Query() query: CarritosDto) { + 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 acceder a esta información.', + ); + return this.carritoService.findAll(operador, query); } @Post() @@ -118,8 +153,15 @@ export class CarritoController { }, }, }) - create(@Body() body: CreateCarritoDto) { + create(@Request() req, @Body() body: CreateCarritoDto) { + const admin: Operador = req.user.operador; + + if (!admin || admin.tipoUsuario.id_tipo_usuario != 3) + throw new ForbiddenException( + 'No tienes los permisos necesarios para realizar esta acción.', + ); return this.carritoService.create( + admin, body.id_modulo, body.id_tipo_carrito, body.id_marca, @@ -145,7 +187,17 @@ export class CarritoController { }, }, }) - update(@Body() body: UpdateCarritoDto) { - return this.carritoService.update(body); + update(@Request() req, @Body() body: UpdateCarritoDto) { + 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.carritoService.update(operador, body); } } diff --git a/src/carrito/carrito.service.ts b/src/carrito/carrito.service.ts index 02b3735..04f57c9 100644 --- a/src/carrito/carrito.service.ts +++ b/src/carrito/carrito.service.ts @@ -1,5 +1,6 @@ import { ConflictException, + ForbiddenException, Injectable, NotFoundException, } from '@nestjs/common'; @@ -7,6 +8,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Carrito } from './entity/carrito.entity'; import { Modulo } from '../modulo/entity/modulo.entity'; +import { Operador } from 'src/operador/entity/operador.entity'; import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; import { InstitucionService } from '../institucion/institucion.service'; import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service'; @@ -26,6 +28,7 @@ export class CarritoService { ) {} async create( + admin: Operador, id_modulo: number, id_tipo_carrito: number, id_marca: number, @@ -39,6 +42,10 @@ export class CarritoService { const marca = await this.marcaService.findById(id_marca, 'c'); const modelo = await this.modeloService.findById(id_modelo, 'c'); + if (admin.institucion.id_institucion != modulo.institucion.id_institucion) + throw new ForbiddenException( + 'No puedes crear un carrito para este módulo porque no pertenece a tu institución.', + ); return this.repository .count({ modulo, tipoCarrito }) .then((carritos) => @@ -57,16 +64,19 @@ export class CarritoService { })); } - async findAll(filtros: { - pagina: string; - activo?: string; - carrito?: string; - id_institucion?: string; - id_marca?: string; - id_modelo?: string; - id_modulo?: string; - id_tipo_carrito?: string; - }) { + async findAll( + operador: Operador, + filtros: { + pagina: string; + activo?: string; + carrito?: string; + id_institucion?: string; + id_marca?: string; + id_modelo?: string; + id_modulo?: string; + id_tipo_carrito?: string; + }, + ) { const institucion = filtros.id_institucion ? await this.institucionService.findById(parseInt(filtros.id_institucion)) : null; @@ -98,13 +108,25 @@ export class CarritoService { .skip((parseInt(filtros.pagina) - 1) * 25) .take(25); + 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 (filtros.activo === 'true') query.andWhere('c.activo = 1'); if (filtros.activo === 'false') query.andWhere('c.activo = 0'); if (filtros.carrito) query.andWhere('c.carrito LIKE :carrito', { carrito: `%${filtros.carrito}%`, }); - if (institucion) + if (institucion && operador.tipoUsuario.id_tipo_usuario === 2) query.andWhere('i.id_institucion = :id_institucion', { id_institucion: institucion.id_institucion, }); @@ -116,10 +138,6 @@ export class CarritoService { 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 (tipoCarrito) query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', { id_tipo_carrito: tipoCarrito.id_tipo_carrito, @@ -160,27 +178,17 @@ export class CarritoService { }); } - async update( - attrs: Partial, - // id_marca?: number, - // id_modelo?: number, - ) { - // 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; - + async update(operador: Operador, attrs: Partial) { return this.findById(attrs.id_carrito) .then(async (carrito) => { + if ( + operador.institucion.id_institucion != + carrito.modulo.institucion.id_institucion + ) + throw new ForbiddenException( + 'No puedes modificar la información este carrito porque no pertenece a tu institución.', + ); Object.assign(carrito, attrs); - // if (marca) carrito.marca = marca; - // if (modelo) carrito.modelo = modelo; return this.repository.save(carrito); }) .then((_) => ({