import { Body, Controller, ForbiddenException, Get, Put, Query, Request, UseGuards, } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiTags, } 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'; import { EquipoOutputDto } from './dto/output/equipo.dto'; import { EquiposOutputDto } from './dto/output/equipos.dto'; @Controller('equipo') @ApiTags('equipo') export class EquipoController { constructor(private equipoService: EquipoService) {} @Serealize(EquipoOutputDto) @Get('equipo') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna la información de un equipo por su número de inventario de una institución.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id de la institución.', name: 'id_institucion', type: 'string', }) @ApiQuery({ description: 'El número de inventario del equipo que se busca.', name: 'numero_inventario', type: 'string', }) 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) @Get('equipos') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna 15 equipos dependiendo de la página en la que esta el usuario y sus filtros.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Página en la que se encuentra el usuario.', name: 'pagina', type: 'string', }) @ApiQuery({ description: 'Carrito que se quiere usar como filtro.', name: 'carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Equipo que se quiere usar como filtro.', name: 'equipo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del carrito que se quiere usar como filtro.', name: 'id_carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Id de la institución que se quiere usar como filtro.', name: 'id_institucion', type: 'string', required: false, }) @ApiQuery({ description: 'Id de la marca que se quiere usar como filtro.', name: 'id_marca', type: 'string', required: false, }) @ApiQuery({ description: 'Id del modelo que se quiere usar como filtro.', name: 'id_modelo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del módulo que se quiere usar como filtro.', name: 'id_modulo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del programa que se quiere usar como filtro.', name: 'id_programa', type: 'string', required: false, }) @ApiQuery({ description: 'Id del status que se quiere usar como filtro.', name: 'id_status', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de carrito que se quiere usar como filtro.', name: 'id_tipo_carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de entrada que se quiere usar como filtro.', name: 'id_tipo_entrada', type: 'string', required: false, }) 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() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que actualiza la información de un equipo.', }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Todas las variables a excepción de id_carrito son opcionales.', examples: { ejemplo: { value: { id_equipo: 1, _equipo: true, _id_carrito: '', _id_operador: 1, _id_status: 1, _motivo: '', }, }, }, }) 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; delete data.motivo; return this.equipoService.update( data, body.id_carrito, body.id_status, body.id_operador, body.motivo, ); } }