From 21e906f768e11bd0d961235b0db1f36295363798 Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Sun, 24 Apr 2022 11:44:36 -0500 Subject: [PATCH] nodemailer --- package-lock.json | 14 ++++++ package.json | 1 + src/app.module.ts | 2 + src/nodemailer/dto/nodemailer-message.dto.ts | 12 +++++ src/nodemailer/nodemailer.module.ts | 8 +++ src/nodemailer/nodemailer.service.spec.ts | 18 +++++++ src/nodemailer/nodemailer.service.ts | 25 ++++++++++ src/usuario/usuario.module.ts | 6 ++- src/usuario/usuario.service.ts | 51 +++++++++++++++----- 9 files changed, 124 insertions(+), 13 deletions(-) create mode 100644 src/nodemailer/dto/nodemailer-message.dto.ts create mode 100644 src/nodemailer/nodemailer.module.ts create mode 100644 src/nodemailer/nodemailer.service.spec.ts create mode 100644 src/nodemailer/nodemailer.service.ts diff --git a/package-lock.json b/package-lock.json index 371e91a..792ebbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "class-validator": "^0.13.2", "moment": "^2.29.3", "mysql2": "^2.3.3", + "nodemailer": "^6.7.3", "passport": "^0.5.2", "passport-jwt": "^4.0.0", "reflect-metadata": "^0.1.13", @@ -7107,6 +7108,14 @@ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, + "node_modules/nodemailer": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", + "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -15225,6 +15234,11 @@ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", "dev": true }, + "nodemailer": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.3.tgz", + "integrity": "sha512-KUdDsspqx89sD4UUyUKzdlUOper3hRkDVkrKh/89G+d9WKsU5ox51NWS4tB1XR5dPUdR4SP0E3molyEfOvSa3g==" + }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", diff --git a/package.json b/package.json index da972a6..7efe846 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "class-validator": "^0.13.2", "moment": "^2.29.3", "mysql2": "^2.3.3", + "nodemailer": "^6.7.3", "passport": "^0.5.2", "passport-jwt": "^4.0.0", "reflect-metadata": "^0.1.13", diff --git a/src/app.module.ts b/src/app.module.ts index 4cc9705..b2e696f 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -49,6 +49,7 @@ import { TipoEntrada } from './tipo-entrada/entity/tipo-entrada.entity'; import { TipoUsuario } from './tipo-usuario/entity/tipo-usuario.entity'; import { UploadFileModule } from './upload-file/upload-file.module'; import { Usuario } from './usuario/entity/usuario.entity'; +import { NodemailerModule } from './nodemailer/nodemailer.module'; @Module({ imports: [ @@ -115,6 +116,7 @@ import { Usuario } from './usuario/entity/usuario.entity'; BcryptModule, UploadFileModule, CronModule, + NodemailerModule, ], }) export class AppModule {} diff --git a/src/nodemailer/dto/nodemailer-message.dto.ts b/src/nodemailer/dto/nodemailer-message.dto.ts new file mode 100644 index 0000000..b7cd8cb --- /dev/null +++ b/src/nodemailer/dto/nodemailer-message.dto.ts @@ -0,0 +1,12 @@ +import { IsEmail, IsInt, IsString } from 'class-validator'; + +export class NodemailerMessageDto { + @IsEmail() + email: string; + + @IsString() + subject: string; + + @IsString() + html: string; +} diff --git a/src/nodemailer/nodemailer.module.ts b/src/nodemailer/nodemailer.module.ts new file mode 100644 index 0000000..09fab94 --- /dev/null +++ b/src/nodemailer/nodemailer.module.ts @@ -0,0 +1,8 @@ +import { Module } from '@nestjs/common'; +import { NodemailerService } from './nodemailer.service'; + +@Module({ + providers: [NodemailerService], + exports: [NodemailerService], +}) +export class NodemailerModule {} diff --git a/src/nodemailer/nodemailer.service.spec.ts b/src/nodemailer/nodemailer.service.spec.ts new file mode 100644 index 0000000..e50823f --- /dev/null +++ b/src/nodemailer/nodemailer.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { NodemailerService } from './nodemailer.service'; + +describe('NodemailerService', () => { + let service: NodemailerService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [NodemailerService], + }).compile(); + + service = module.get(NodemailerService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/nodemailer/nodemailer.service.ts b/src/nodemailer/nodemailer.service.ts new file mode 100644 index 0000000..bcd9a5c --- /dev/null +++ b/src/nodemailer/nodemailer.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import * as nodemailer from 'nodemailer'; +import { NodemailerMessageDto } from './dto/nodemailer-message.dto'; + +@Injectable() +export class NodemailerService { + constructor(private configService: ConfigService) {} + + sendEmail(message: NodemailerMessageDto) { + const transporter = nodemailer.createTransport({ + service: this.configService.get('NODEMAILER_SERVICE'), + auth: { + user: this.configService.get('NODEMAILER_USER'), + pass: this.configService.get('NODEMAILER_PASWORD'), + }, + }); + + return transporter.sendMail({ + to: message.email, + subject: message.subject, + html: message.html, + }); + } +} diff --git a/src/usuario/usuario.module.ts b/src/usuario/usuario.module.ts index 9069015..ee9474a 100644 --- a/src/usuario/usuario.module.ts +++ b/src/usuario/usuario.module.ts @@ -5,7 +5,8 @@ import { UsuarioController } from './usuario.controller'; import { UsuarioService } from './usuario.service'; import { Usuario } from './entity/usuario.entity'; import { BcryptModule } from '../bcrypt/bcrypt.module'; -// import { CarreraModule } from '../carrera/carrera.module'; +import { CarreraModule } from '../carrera/carrera.module'; +import { NodemailerModule } from '../nodemailer/nodemailer.module'; import { InstitucionModule } from '../institucion/institucion.module'; import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module'; @@ -14,8 +15,9 @@ import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module'; PassportModule.register({ defaultStrategy: 'jwt' }), TypeOrmModule.forFeature([Usuario]), BcryptModule, - // CarreraModule, + CarreraModule, InstitucionModule, + NodemailerModule, TipoUsuarioModule, ], controllers: [UsuarioController], diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts index 4077312..6552d15 100644 --- a/src/usuario/usuario.service.ts +++ b/src/usuario/usuario.service.ts @@ -10,8 +10,9 @@ import { Carrera } from '../carrera/entity/carrera.entity'; import { Institucion } from '../institucion/entity/institucion.entity'; import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity'; import { BcryptService } from '../bcrypt/bcrypt.service'; -// import { CarreraService } from '../carrera/carrera.service'; +import { CarreraService } from '../carrera/carrera.service'; import { InstitucionService } from '../institucion/institucion.service'; +import { NodemailerService } from '../nodemailer/nodemailer.service'; import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service'; @Injectable() @@ -19,11 +20,35 @@ export class UsuarioService { constructor( @InjectRepository(Usuario) private repository: Repository, private bcryptService: BcryptService, - // private carreraService: CarreraService, + private carreraService: CarreraService, private institucionService: InstitucionService, + private nodemailerService: NodemailerService, private tipoUsuarioService: TipoUsuarioService, ) {} + correoPassword(password: string) { + return `

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

+

Para acceder al servicio debe hacerlo con los siguientes datos:

+ +

• Usuario: Número de cuenta o número de trabajador

+ +

• 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 findAll(filtros: { pagina: string; id_carrera?: string; @@ -43,18 +68,16 @@ export class UsuarioService { const tipoUsuario = filtros.id_tipo_usuario ? await this.tipoUsuarioService.findById(Number(filtros.id_tipo_usuario)) : null; - /* Terminar cuando se tengan las fuinciones faltantes */ - // const carrera = filtros.id_carrera - // ? await this.carreraService.findById(Number(filtros.id_carrera)) - // : null; + const carrera = filtros.id_carrera + ? await this.carreraService.findById(Number(filtros.id_carrera)) + : null; - /* buscar like */ + /* buscar usnado like */ if (filtros.usuario) busqueda.usuario = filtros.usuario; if (institucion) busqueda.institucion = institucion; if (tipoUsuario) busqueda.tipoUsuario = tipoUsuario; - // if (carrera) busqueda.carrera = carrera; - /* falta página */ - console.log(busqueda); + if (carrera) busqueda.carrera = carrera; + /* falta página, paginado */ return this.repository.find(busqueda); } @@ -111,9 +134,15 @@ export class UsuarioService { ); usuario.telefono = telefono; usuario.password = this.bcryptService.encriptar(password); - /* Mandar correo con contraseña */ return this.repository.save(usuario); }) + .then((usuario) => + this.nodemailerService.sendEmail({ + email: `${usuario.usuario}@pcpuma.acatlan.unam.mx`, + subject: 'Credenciales Pc Puma', + html: this.correoPassword(password), + }), + ) .then((_) => ({ message: 'Se creo correctamente un usuario.' })); }