Files
pcpuma_unam_api/src/equipo/equipo.controller.ts
T
2022-08-06 00:01:43 -05:00

220 lines
5.8 KiB
TypeScript

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,
);
}
}