import { Body, Controller, 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 { IdInstitucionOptionalDto } from '../dto/input/id-institucion-optional.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 { OnlyModuloOutputDto } from './dto/output/only-modulo.dto'; @Controller('modulo') @ApiTags('modulo') export class ModuloController { constructor( private moduloService: ModuloService, private validarUsuarioService: ValidarUsuarioService, ) {} @Serealize(MessageOutputDto) @Post() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Crear un nuevo módulo.' }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Variables que necesita el endpoint.', examples: { ejemplo: { value: { 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: 'Información de un módulo de la institución de un operador.', }) @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.findMinInfoById(parseInt(query.id_modulo)); } @Serealize(ModuloOutputDto) @Get('modulos') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Todos los módulos de una institución.' }) @ApiBearerAuth('jwt') modulos(@Request() req, @Query() query: IdInstitucionOptionalDto) { const superAdmin: Operador = req.user.operador; this.validarUsuarioService.validarSuperAdmin(superAdmin); return this.moduloService.findAll(parseInt(query.id_institucion)); } @Serealize(OnlyModuloOutputDto) @Get('modulos-activos') @ApiOperation({ description: '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.findAllActivo(parseInt(query.id_institucion)); } @Serealize(OnlyModuloOutputDto) @Get('modulos-operador') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Todos los módulos de una institución de un operador.', }) @ApiBearerAuth('jwt') modulosOperador(@Request() req) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); return this.moduloService.findAllAdmin(operador); } @Serealize(MessageOutputDto) @Put() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Actualizar la información de un módulo.' }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Variables que necesita el endpoint. Las variables con "_" al inicio son opcionales.', examples: { ejemplo: { value: { id_modulo: 1, _activo: true, _modulo: '', _motivo: '', _numero_alumnos: 1, _fecha_creacion: '', }, }, }, }) update(@Request() req, @Body() body: UpdateModuloDto) { const admin: Operador = req.user.operador; const data = { ...body }; this.validarUsuarioService.validarAdmin(admin); delete data.motivo; delete data.numero_alumnos; delete data.fecha_creacion; return this.moduloService.update( admin, data, body.motivo, body.numero_alumnos, body.fecha_creacion, ); } }