From 4a24eafa0d78eb280916bcd13fd8d6304e16b08f Mon Sep 17 00:00:00 2001 From: jorgemike Date: Sat, 28 Jun 2025 18:21:12 -0600 Subject: [PATCH] Refactor MailController and MailService for improved readability and consistency --- src/mail/mail.controller.ts | 43 +++++-------- src/mail/mail.service.ts | 120 +++++++++++------------------------- 2 files changed, 51 insertions(+), 112 deletions(-) diff --git a/src/mail/mail.controller.ts b/src/mail/mail.controller.ts index 59ac43a..da174b8 100644 --- a/src/mail/mail.controller.ts +++ b/src/mail/mail.controller.ts @@ -7,58 +7,47 @@ import { } from '@nestjs/common'; import { MailService } from './mail.service'; import { ApiTags } from '@nestjs/swagger'; -import { ApiSendMail} from './mail.decorators'; +import { ApiSendMail } from './mail.decorators'; import { SistemaService } from 'src/sistema/sistema.service'; import { SendCorreoDto } from 'src/mail/dto/send-email.dto'; import { AuthService } from 'src/auth/auth.service'; - @ApiTags('Mail') // Grupo de endpoints @Controller('mail') export class MailController { constructor( private readonly sistemaService: SistemaService, private readonly mailService: MailService, - // private readonly excelService: ExcelService, - private readonly authService: AuthService - + // private readonly excelService: ExcelService, + private readonly authService: AuthService, ) {} // Endpoint para enviar correos a través de una solicitud POST - - @Post('send') @ApiSendMail() async sendMail( - @Headers() headers:{token:string}, - @Body() body: SendCorreoDto + @Headers() headers: { token: string }, + @Body() body: SendCorreoDto, ) { - if (!headers.token) { throw new UnauthorizedException('Header "token" es requerido'); } - - const result = - await this.mailService.sendMail(body,headers.token) - .then((value) => { - console.log("ya acabe el correo", value); - - }) - .catch((err)=>{ - console.log(err) - }) - - + + const result = await this.mailService + .sendMail(body, headers.token) + .then((value) => { + console.log('ya acabe el correo', value); + }) + .catch((err) => { + console.log(err); + }); + // sistem return result; - - - - } -/* + /* @Post('send-excel') @UseInterceptors(FileInterceptor('file')) diff --git a/src/mail/mail.service.ts b/src/mail/mail.service.ts index a8a3fde..9c9e5b4 100644 --- a/src/mail/mail.service.ts +++ b/src/mail/mail.service.ts @@ -8,24 +8,18 @@ import { SendCorreoDto } from 'src/mail/dto/send-email.dto'; import { AuthService } from 'src/auth/auth.service'; import { decrypt } from '../crypto/crypto.util'; - - @Injectable() export class MailService { - - constructor( private readonly sistemaService: SistemaService, private readonly authService: AuthService, - @InjectRepository(Correo) private readonly correoRepository: Repository, - @InjectRepository(Status) private readonly statusRepository: Repository, - @InjectRepository(Sistema) private readonly sistemaRepositosistemaRepositoryry: Repository - - + @InjectRepository(Correo) + private readonly correoRepository: Repository, + @InjectRepository(Status) + private readonly statusRepository: Repository, + @InjectRepository(Sistema) + private readonly sistemaRepositosistemaRepositoryry: Repository, ) { - - - /* this.transporter = nodemailer.createTransport({ host: 'smtp-relay.gmail.com', port: 587, @@ -36,8 +30,6 @@ export class MailService { pass: process.env.PASS_GMAIL, }, }); */ - - /* this.transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2) @@ -54,7 +46,6 @@ export class MailService { */ - /* this.transporter = nodemailer.createTransport({ host: 'localhost', @@ -64,84 +55,60 @@ export class MailService { */ } - - async findAllBySistema(TOKEN: string, nombreSistema: string) { - - if (!TOKEN) { throw new UnauthorizedException('Header "Password" es requerido'); } - - - const sistem = await this.sistemaService.acceso(TOKEN) + const sistem = await this.sistemaService.acceso(TOKEN); if (!sistem) { throw new UnauthorizedException('Password incorrecto'); } - const result = await this.correoRepository.find({ where: { - id_sistema: { nombre_sistema: nombreSistema } + id_sistema: { nombre_sistema: nombreSistema }, }, relations: { id_sistema: true, id_status: true, }, - } - ) - return result + }); + return result; } async sendMail(sendEmail: SendCorreoDto, token: string) { - console.log("token", token) - let payload + console.log('token', token); + let payload; payload = await this.authService.verificarToken(token); - console.log("payload", payload) + console.log('payload', payload); if (!payload || !payload.nombre) { throw new UnauthorizedException('Token inválido o incompleto'); } - const sistem = await this.sistemaService.findByNombre(payload.nombre) - + const sistem = await this.sistemaService.findByNombre(payload.nombre); if (!sistem) { throw new UnauthorizedException('sistema No encontrado'); } - - - const decryptedPassword = decrypt( sistem.email_password_encrypted, - sistem.email_password_iv + sistem.email_password_iv, ); + console.log('decryptedPassword', decryptedPassword); + const decryptedToken = decrypt( sistem.refreshToken_encrypted, - sistem.refreshToken_iv + sistem.refreshToken_iv, ); - - - + console.log('decryptedToken', decryptedToken); const transporter = nodemailer.createTransport({ - /* host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2) - port: 587, - secure: false, - requireTLS: true, // TLS STARTTLS - auth: { user:sistem.email, pass:decryptedPassword}, - pool: true, // <‑‑ activa reuse - maxConnections: 1, // una sola conexión viva - maxMessages: 100, // reabrir después de 100 envíos - rateDelta: 2000, // ventana 1 s - rateLimit: 1 // máx. 5 mensajes/seg - */ - service: 'gmail', auth: { type: 'OAuth2', @@ -155,16 +122,13 @@ export class MailService { maxConnections: 1, maxMessages: 100, rateDelta: 2000, - rateLimit: 1 - - + rateLimit: 1, }); - - - console.log("estos son los archivos adjuntos en el service", sendEmail.adjuntos); - - + console.log( + 'estos son los archivos adjuntos en el service', + sendEmail.adjuntos, + ); const mailOptions = { from: sistem.email, @@ -185,29 +149,22 @@ export class MailService { return { filename: adj.filename || 'qr.png', content: Buffer.from(base64Clean, adj.encoding || 'base64'), - cid: adj.cid || 'qrCode', // el mismo que uses en - contentType: 'image/png' // recomendable para que sepa que es PNG + cid: adj.cid || 'qrCode', // el mismo que uses en + contentType: 'image/png', // recomendable para que sepa que es PNG }; - }) - - + }), }; - - console.log(mailOptions); - - - + console.log("mailOptions", mailOptions); let resMail = await transporter.sendMail(mailOptions); - if (!resMail) throw new Error("") + if (!resMail) throw new Error(''); + const statusTexto = resMail.accepted.length > 0 ? 'Enviado' : 'Fallido'; - const statusTexto = resMail.accepted.length > 0 ? "Enviado" : "Fallido"; - - - let status = await this.statusRepository.findOne({ where: { status: statusTexto } }); - + let status = await this.statusRepository.findOne({ + where: { status: statusTexto }, + }); if (!status) { status = this.statusRepository.create({ status: statusTexto }); @@ -221,20 +178,13 @@ export class MailService { fecha_enviado: new Date(), destinatario: sendEmail.to, remitente: sistem.email, - }); - if (!resMail) { - throw new Error("fallo") + throw new Error('fallo'); } this.correoRepository.save(info); - - - return (statusTexto); + return statusTexto; } - - - }