import { Body, Controller, ForbiddenException, Get, Post, 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 { ModuloService } from './modulo.service'; import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service'; import { Operador } from '../operador/entity/operador.entity'; import { IdInstitucionDto } from '../dto/input/id-institucion.dto'; import { CreateModuloDto } from './dto/input/create.dto'; import { ModuloDto } from './dto/input/modulo.dto'; import { UpdateModuloDto } from './dto/input/update.dto'; import { MessageOutputDto } from '../dto/output/message.dto'; import { ModuloOutputDto } from './dto/output/modulo.dto'; import { OnlyModuloMinOutputDto } from './dto/output/only-modulo-min.dto'; @Controller('modulo') @ApiTags('modulo') export class ModuloController { constructor( private moduloService: ModuloService, private validarUsuarioService: ValidarUsuarioService, ) {} @Serealize(MessageOutputDto) @Post() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que crea un módulo.' }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Ambas variables son obligatorias.', examples: { ejemplo: { value: { id_institucion: 200, modulo: '' } } }, }) create(@Request() req, @Body() body: CreateModuloDto) { const admin: Operador = req.user.operador; this.validarUsuarioService.validarAdmin(admin); return this.moduloService.create(admin, body.modulo); } @Serealize(ModuloOutputDto) @Get('modulo') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna la información de un módulo.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id del modulo.', name: 'id_modulo', type: 'string', }) modulo(@Request() req, @Query() query: ModuloDto) { const admin: Operador = req.user.operador; this.validarUsuarioService.validarAdmin(admin); return this.moduloService .findMinInfoModuloById(parseInt(query.id_modulo)) .then((modulo) => { if ( admin.tipoUsuario.id_tipo_usuario === 3 && admin.institucion.id_institucion != modulo.institucion.id_institucion ) throw new ForbiddenException( 'No puedes acceder a esta información porque no le pertenece a tu institución.', ); return modulo; }); } @Serealize(OnlyModuloMinOutputDto) @Get('modulos') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna todos los módulos de una institución.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id de la institución.', name: 'id_institucion', type: 'string', }) modulos(@Request() req, @Query() query: IdInstitucionDto) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarOperador(operador); return this.moduloService.findMinInfoModuloAll( parseInt(query.id_institucion), ); } @Serealize(OnlyModuloMinOutputDto) @Get('modulos-activos') @ApiOperation({ description: 'Endpoint que retorna todos los módulos de una institución.', }) @ApiQuery({ description: 'Id de la institución.', name: 'id_institucion', type: 'string', }) modulosActivos(@Query() query: IdInstitucionDto) { return this.moduloService.findMinInfoModuloAll( parseInt(query.id_institucion), 1, ); } @Serealize(MessageOutputDto) @Put() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que actualiza la información de un módulo.', }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Todas las variables a excepción de id_modulo son opcionales.', examples: { ejemplo: { value: { id_modulo: 1, _activo: true, _modulo: '' } }, }, }) update(@Request() req, @Body() body: UpdateModuloDto) { const admin: Operador = req.user.operador; this.validarUsuarioService.validarAdmin(admin); return this.moduloService.update(admin, body); } }