Files
pcpuma_unam_api/src/usuario/usuario.controller.ts
T
Edrei Téllez ce1d1396e0 SEC-001: migrar HcaptchaGuard a TurnstileGuard con siteverify Cloudflare.
Bypass solo en desarrollo; pruebas y producción validan header turnstile vía HTTPS nativo.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-23 10:29:57 -06:00

186 lines
5.1 KiB
TypeScript

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 { TurnstileGuard } from '../guards/turnstile.guard';
import { UsuarioService } from './usuario.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { RegistrarUsuarioInputDto } from './dto/input/registrar.dto';
import { UpdateUsuarioInputDto } from './dto/input/update.dto';
import { UsuarioInputDto } from './dto/input/usuario.dto';
import { UsuariosInputDto } from './dto/input/usuarios.dto';
import { MessageOutputDto } from '../dto/output/message.dto';
import { UsuarioOutputDto } from './dto/output/usuario.dto';
import { UsuariosOutputDto } from './dto/output/usuarios.dto';
@Controller('usuario')
@ApiTags('usuario')
export class UsuarioController {
constructor(
private usuarioService: UsuarioService,
private validarUsuarioService: ValidarUsuarioService,
) {}
@Serealize(MessageOutputDto)
@Post('registrar')
@UseGuards(TurnstileGuard)
@ApiOperation({ description: 'Registro de usuario.' })
@ApiBody({
description: 'Variables que necesita el endpoint.',
examples: {
ejemplo: {
value: {
id_institucion_carrera: 1,
telefono: '',
usuario: '',
_rfc: '',
},
},
},
})
registrar(@Body() body: RegistrarUsuarioInputDto) {
return this.usuarioService.registrar(
body.id_institucion_carrera,
body.usuario,
body.telefono,
body.rfc,
);
}
@Serealize(MessageOutputDto)
@Put()
@UseGuards(AuthGuard('jwt'))
@ApiOperation({ description: 'Actualizar información de un usuario.' })
@ApiBearerAuth('jwt')
@ApiBody({
description:
'Variables que necesita el endpoint. Las variables con "_" al inicio son opcionales.',
examples: {
ejemplo: {
value: {
id_usuario: 1,
_correo: '',
_telefono: '',
},
},
},
})
update(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.usuarioService.update(operador, body);
}
@Serealize(MessageOutputDto)
@Put('update-password')
@UseGuards(AuthGuard('jwt'))
@ApiOperation({ description: 'Reenviar password al usuario.' })
@ApiBearerAuth('jwt')
@ApiBody({
description: 'Variables que necesita el endpoint.',
examples: { ejemplo: { value: { id_usuario: 1 } } },
})
passwordResset(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.usuarioService.passwordReset(operador, body.id_usuario);
}
@Serealize(UsuarioOutputDto)
@Get('usuario')
@UseGuards(AuthGuard('jwt'))
@ApiOperation({ description: 'Información de un usuario.' })
@ApiBearerAuth('jwt')
@ApiQuery({
description: 'El número de cuenta que se quiere buscar.',
name: 'usuario',
type: 'string',
})
usuario(@Request() req, @Query() query: UsuarioInputDto) {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.usuarioService.findFullInfoByUsuario(operador, query.usuario);
}
@Serealize(UsuariosOutputDto)
@Get('usuarios')
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
description:
'Información de 25 usuarios dependiendo de los filtros enviados.',
})
@ApiBearerAuth('jwt')
@ApiQuery({
description: 'Página en la que se encuentra el operador.',
name: 'pagina',
type: 'string',
})
@ApiQuery({
description: 'Todos los usuarios activos.',
name: 'activo',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Id de la carrera que se quiere usar como filtro.',
name: 'id_carrera',
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 del tipo usuario que se quiere usar como filtro.',
name: 'id_tipo_usuario',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Nombre del usuario que se quiere buscar.',
name: 'nombre',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Todos los usuarios registrados.',
name: 'password',
type: 'string',
required: false,
})
@ApiQuery({
description: 'Usuario que se quiere buscar.',
name: 'usuario',
type: 'string',
required: false,
})
usuarios(@Request() req, @Query() query: UsuariosInputDto) {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarOperador(operador);
return this.usuarioService.findAll(operador, query);
}
}