From 64b6258506d7116ed7bb0a4ff0f58d372421c653 Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Tue, 12 Jul 2022 16:20:54 -0500 Subject: [PATCH] nuevos datos de operador --- src/bcrypt/bcrypt.service.ts | 12 +++++ src/operador/dto/input/create.dto.ts | 8 +++- src/operador/dto/output/operador.dto.ts | 6 +++ src/operador/entity/operador.entity.ts | 6 +++ src/operador/operador.controller.ts | 17 +++++++ src/operador/operador.module.ts | 2 + src/operador/operador.service.ts | 60 +++++++++++++++++++++++-- src/usuario/usuario.module.ts | 2 +- src/usuario/usuario.service.ts | 16 +------ 9 files changed, 110 insertions(+), 19 deletions(-) diff --git a/src/bcrypt/bcrypt.service.ts b/src/bcrypt/bcrypt.service.ts index 6dffe0e..54ba173 100644 --- a/src/bcrypt/bcrypt.service.ts +++ b/src/bcrypt/bcrypt.service.ts @@ -17,4 +17,16 @@ export class BcryptService { return bcrypt.hashSync(password, salt); } + + generarPassword = () => { + const length = 8; + const charset = + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + const n = charset.length; + let password = ''; + + for (let i = 0; i < length; i++) + password += charset.charAt(Math.floor(Math.random() * n)); + return password; + }; } diff --git a/src/operador/dto/input/create.dto.ts b/src/operador/dto/input/create.dto.ts index 12f8526..d20ef0e 100644 --- a/src/operador/dto/input/create.dto.ts +++ b/src/operador/dto/input/create.dto.ts @@ -1,12 +1,18 @@ -import { IsInt, IsString } from 'class-validator'; +import { IsEmail, IsInt, IsString } from 'class-validator'; export class CreateOperadorDto { + @IsEmail() + correo: string; + @IsInt() id_institucion: number; @IsInt() id_tipo_usuario: number; + @IsString() + nombre: string; + @IsString() operador: string; diff --git a/src/operador/dto/output/operador.dto.ts b/src/operador/dto/output/operador.dto.ts index 3f9b21f..c3f2490 100644 --- a/src/operador/dto/output/operador.dto.ts +++ b/src/operador/dto/output/operador.dto.ts @@ -9,6 +9,12 @@ export class OperadorOutputDto { @Expose() activo; + @Expose() + correo; + + @Expose() + nombre; + @Expose() operador; diff --git a/src/operador/entity/operador.entity.ts b/src/operador/entity/operador.entity.ts index f6fe4e4..bd1a018 100644 --- a/src/operador/entity/operador.entity.ts +++ b/src/operador/entity/operador.entity.ts @@ -20,6 +20,12 @@ export class Operador { @Column({ type: Boolean, nullable: false, default: false }) activo: boolean; + @Column({ type: String, nullable: false, length: 60 }) + correo: string; + + @Column({ type: String, nullable: false, length: 100 }) + nombre: string; + @Column({ type: String, nullable: false, length: 50 }) operador: string; diff --git a/src/operador/operador.controller.ts b/src/operador/operador.controller.ts index 77db025..b1d0e88 100644 --- a/src/operador/operador.controller.ts +++ b/src/operador/operador.controller.ts @@ -30,8 +30,10 @@ export class OperadorController { examples: { ejemplo: { value: { + correo: '', id_institucion: 200, id_tipo_usuario: 4, + nombre: '', operador: '', password: '', }, @@ -43,6 +45,8 @@ export class OperadorController { body.id_institucion, body.id_tipo_usuario, body.operador, + body.nombre, + body.correo, body.password, ); } @@ -100,6 +104,19 @@ export class OperadorController { // @UseGuards(AuthGuard('jwt')) // reporte() {} + @Put('update-password') + // @UseGuards(AuthGuard('jwt')) + @ApiOperation({ + description: 'Enpoint que envía una nueva password al correo del usuario.', + }) + @ApiBody({ + description: 'Es obligatorio enviar el campo id_usuario.', + examples: { ejemplo: { value: { id_usuario: 1 } } }, + }) + passwordResset(@Body() body: UpdateOperadorDto) { + return this.operadorService.passwordReset(body.id_operador, body.password); + } + @Put() // @UseGuards(AuthGuard('jwt')) @ApiOperation({ diff --git a/src/operador/operador.module.ts b/src/operador/operador.module.ts index 682b105..458daf1 100644 --- a/src/operador/operador.module.ts +++ b/src/operador/operador.module.ts @@ -6,12 +6,14 @@ import { OperadorService } from './operador.service'; import { Operador } from './entity/operador.entity'; import { BcryptModule } from '../bcrypt/bcrypt.module'; import { InstitucionModule } from '../institucion/institucion.module'; +import { NodemailerModule } from '../nodemailer/nodemailer.module'; import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module'; @Module({ imports: [ BcryptModule, InstitucionModule, + NodemailerModule, PassportModule.register({ defaultStrategy: 'jwt' }), TipoUsuarioModule, TypeOrmModule.forFeature([Operador]), diff --git a/src/operador/operador.service.ts b/src/operador/operador.service.ts index d5ad4ad..d530ca7 100644 --- a/src/operador/operador.service.ts +++ b/src/operador/operador.service.ts @@ -9,6 +9,7 @@ import { Institucion } from '../institucion/entity/institucion.entity'; import { Operador } from './entity/operador.entity'; import { BcryptService } from '../bcrypt/bcrypt.service'; import { InstitucionService } from '../institucion/institucion.service'; +import { NodemailerService } from '../nodemailer/nodemailer.service'; import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service'; @Injectable() @@ -17,14 +18,39 @@ export class OperadorService { @InjectRepository(Operador) private repository: Repository, private bcryptService: BcryptService, private institucionService: InstitucionService, + private nodemailerService: NodemailerService, private tipoUsuarioService: TipoUsuarioService, ) {} + correoPassword(operador, password: string) { + return `

Estimado operador, su registro se realizó con éxito.

+

Para acceder al servicio debe hacerlo con los siguientes datos:

+ +

• Usuario: ${operador}

+ +

• Contraseña: ${password}

+ +

+ El presente registro le permite hacer uso del préstamo del equipo de cómputo seleccionado, el cual puede ser utilizado únicamente al interior de la FES Acatlán. + Para acceder al servicio es obligatorio y su responsabilidad leer los lineamientos "pcpuma-solicita" en la siguiente liga: https://www.acatlan.unam.mx/pcpuma/Lineamientos.html + Hacemos de su conocimiento que la presente información es confidencial y debe ser tratada como tal, es de uso exclusivo para el usuario al que fue asignada y se encuentra protegida por la normatividad de la Universidad Nacional Autónoma de México en la materia, cualquier uso no autorizado o indebido se hará del conocimiento de la autoridad universitaria. + Puede consultar nuestro aviso de privacidad en: https://www.acatlan.unam.mx/normatividad. +

+ +

Para mayor información o duda contáctenos por este medio.

+ +

Atte.

+ +

Pc Puma Solicita

`; + } + async create( id_institucion: number, id_tipo_usuario: number, operador: string, - password: string, + nombre: string, + correo: string, + password?: string, ) { const institucion = await this.institucionService.findById(id_institucion); const tipoUsuario = await this.tipoUsuarioService.findById(id_tipo_usuario); @@ -46,16 +72,25 @@ export class OperadorService { throw new ConflictException( 'Ya existe un operador en esta institución con ese nombre, intenta de nuevo con otro.', ); - password = this.bcryptService.encriptar(password); + if (password!) password = this.bcryptService.generarPassword(); return this.repository.save( this.repository.create({ + correo, institucion, + nombre, operador, - password, + password: this.bcryptService.encriptar(password), tipoUsuario, }), ); }) + .then((operador) => + this.nodemailerService.sendEmail({ + email: operador.correo, + subject: 'Credenciales Pc Puma', + html: this.correoPassword(password, operador.correo), + }), + ) .then((_) => ({ message: `Se creó correctamente un nuevo ${tipoUsuario.tipo_usuario.toLowerCase()}.`, })); @@ -140,6 +175,25 @@ export class OperadorService { }); } + passwordReset(id_operador: number, password?: string) { + return this.findById(id_operador) + .then((operador) => { + if (!password) password = this.bcryptService.generarPassword(); + operador.password = this.bcryptService.encriptar(password); + return this.repository.save(operador); + }) + .then((operador) => + this.nodemailerService.sendEmail({ + email: operador.correo, + subject: 'Credenciales Pc Puma', + html: this.correoPassword(password, operador.correo), + }), + ) + .then((_) => ({ + message: 'Se cambió correctamente la constraseña del operador.', + })); + } + update(attrs: Partial) { return this.findById(attrs.id_operador) .then((operador) => { diff --git a/src/usuario/usuario.module.ts b/src/usuario/usuario.module.ts index 07def22..dfee3d8 100644 --- a/src/usuario/usuario.module.ts +++ b/src/usuario/usuario.module.ts @@ -5,10 +5,10 @@ import { UsuarioController } from './usuario.controller'; import { UsuarioService } from './usuario.service'; import { Usuario } from './entity/usuario.entity'; import { BcryptModule } from '../bcrypt/bcrypt.module'; -import { NodemailerModule } from '../nodemailer/nodemailer.module'; import { InstitucionModule } from '../institucion/institucion.module'; import { InstitucionCarreraModule } from '../institucion-carrera/institucion-carrera.module'; import { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usuario.module'; +import { NodemailerModule } from '../nodemailer/nodemailer.module'; import { SoapClientModule } from '../soap-client/soap-client.module'; import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module'; diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts index c8724b6..4a64ae3 100644 --- a/src/usuario/usuario.service.ts +++ b/src/usuario/usuario.service.ts @@ -216,20 +216,8 @@ export class UsuarioService { }); } - generarPassword = () => { - const length = 8; - const charset = - 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - const n = charset.length; - let password = ''; - - for (let i = 0; i < length; i++) - password += charset.charAt(Math.floor(Math.random() * n)); - return password; - }; - passwordReset(id_usuario: number) { - const password = this.generarPassword(); + const password = this.bcryptService.generarPassword(); return this.findById(id_usuario, true, true) .then((usuario) => { @@ -249,7 +237,7 @@ export class UsuarioService { } registrar(id_institucion_usuario: number, telefono: string, correo?: string) { - const password = this.generarPassword(); + const password = this.bcryptService.generarPassword(); let message = 'Se creó correctamente tu cuenta, ingresa a tu correo institucional y consulta tu contraseña para acceder a este servicio.';