Files
pcpuma_unam_api/src/usuario/usuario.controller.ts
T
2022-10-16 19:17:04 -05:00

175 lines
4.8 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 { Recaptcha } from '@nestlab/google-recaptcha';
import { Serealize } from '../interceptors/serialize.interceptor';
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 { 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,
) {}
@Post('registrar')
@Recaptcha()
@ApiOperation({
description: 'Enpoint que realiza el registro de un usuario.',
})
@ApiBody({
description:
'Todas la variables a excepción de id_usuario son obligatorias.',
examples: {
ejemplo: { value: { id_usuario: 1, telefono: '', correo: '' } },
},
})
registrar(@Body() body: RegistrarUsuarioInputDto) {
return this.usuarioService.registrar(
body.id_institucion_carrera,
body.usuario,
body.telefono,
body.rfc,
);
}
@Put()
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
description: 'Enpoint que actualiza la información de un usuario.',
})
@ApiBearerAuth('jwt')
@ApiBody({
description:
'Todas las variables a excepción de id_usuario son opcionales.',
examples: {
ejemplo: {
value: {
correo: '',
id_usuario: 1,
telefono: '',
},
},
},
})
update(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.usuarioService.update(operador, body);
}
@Put('update-password')
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
description: 'Enpoint que envía una nueva password al correo del usuario.',
})
@ApiBearerAuth('jwt')
@ApiBody({
description: 'Es obligatorio enviar el campo id_usuario.',
examples: { ejemplo: { value: { id_usuario: 1 } } },
})
passwordResset(@Request() req, @Body() body: UpdateUsuarioInputDto) {
const admin: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(admin);
return this.usuarioService.passwordReset(body.id_usuario);
}
@Serealize(UsuarioOutputDto)
@Get('usuario')
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
description: 'Enpoint que retorna la 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.findFullInfoUsuarioByUsuario(
operador,
query.usuario,
);
}
@Serealize(UsuariosOutputDto)
@Get('usuarios')
@UseGuards(AuthGuard('jwt'))
@ApiOperation({
description:
'Endpoint que retorna 25 usuarios dependiendo de la página en la que se encuentra el usuario y sus filtros.',
})
@ApiBearerAuth('jwt')
@ApiQuery({
description: 'Página en la que se encuentra el usuario.',
name: 'pagina',
type: 'string',
})
@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 carrera que se quiere usar como filtro.',
name: 'id_carrera',
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: '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(query);
}
}