import { Body, ForbiddenException, 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 { InstitucionProgramaService } from './institucion-programa.service'; import { Operador } from 'src/operador/entity/operador.entity'; import { Usuario } from 'src/usuario/entity/usuario.entity'; import { IdInstitucionDto } from '../dto/id-institucion.dto'; import { CreateProgramaDto } from './dto/input/create.dto'; import { UpdateProgramaDto } from './dto/input/update.dto'; import { InstitucionProgramaOutputDto } from './dto/output/institucion-programa.dto'; import { InstitucionProgramaMinOutputDto } from './dto/output/institucion-programa-min.dto'; import { ProgramaOutputDto } from './dto/output/programa.dto'; @Controller('institucion-programa') @ApiTags('institucion-programa') export class InstitucionProgramaController { constructor(private institucionProgramaService: InstitucionProgramaService) {} @Post() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que crea un programa nuevo.' }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Es obligatorio mandar la varible programa.', examples: { ejemplo: { value: { programa: '' } } }, }) create(@Request() req, @Body() body: CreateProgramaDto) { const superAdmin: Operador = req.user.operador; if (!superAdmin || superAdmin.tipoUsuario.id_tipo_usuario != 2) throw new ForbiddenException( 'No tienes los permisos necesarios para realizar esta acción.', ); return this.institucionProgramaService.create(body.programa); } @Serealize(ProgramaOutputDto) @Get() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna todos los programas.' }) @ApiBearerAuth('jwt') get(@Request() req) { const operador: Operador = req.user.operador; if ( !operador || (operador.tipoUsuario.id_tipo_usuario != 2 && 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.institucionProgramaService.findAllProgramas(); } @Serealize(InstitucionProgramaOutputDto) @Get('programas') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna todos los programas de una institución.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id de la institución.', name: 'id_institucion', type: 'string', }) programas(@Request() req, @Query() query: IdInstitucionDto) { const admin: Operador = req.user.operador; if (!admin || admin.tipoUsuario.id_tipo_usuario != 3) throw new ForbiddenException( 'No tienes los permisos necesarios para acceder a esta información.', ); return this.institucionProgramaService.findAllByIdInstitucion( parseInt(query.id_institucion), ); } @Serealize(InstitucionProgramaMinOutputDto) @Get('programas-mostrar') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna todos los programas de una institución que tengan el campo mostrar en true.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id de la institución.', name: 'id_institucion', type: 'string', }) programasMostrar(@Request() req, @Query() query: IdInstitucionDto) { const usuario: Usuario = req.user.usuario; if (!usuario) throw new ForbiddenException( 'No tienes los permisos necesarios para acceder a esta información.', ); return this.institucionProgramaService.findAllByIdInstitucion( parseInt(query.id_institucion), true, ); } @Put() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que actualiza la información de una institución programa.', }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Es obligatorio mandar la varible programa.', examples: { ejemplo: { value: { id_institucion_programa: 130, mostrar: true } }, }, }) update(@Request() req, @Body() body: UpdateProgramaDto) { 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.institucionProgramaService.update(admin, body); } }