ultima versión

This commit is contained in:
evenegas
2025-06-27 20:43:08 -06:00
parent 8949c57bdb
commit ccf476bd6e
2 changed files with 129 additions and 126 deletions
+4 -3
View File
@@ -3,19 +3,20 @@ import { JwtService } from '@nestjs/jwt';
@Injectable()
export class AuthService {
constructor(private jwtService: JwtService) {}
constructor(private jwtService: JwtService) { }
generarToken(payload: any) {
return this.jwtService.sign(payload, {
secret: process.env.JWT_SECRET,
secret: process.env.JWT_SECRET,
expiresIn: '1d',
});
}
verificarToken(token: string) {
try {
return this.jwtService.verify(token, {
secret: process.env.JWT_SECRET,
secret: process.env.JWT_SECRET,
});
} catch {
return null;
+125 -123
View File
@@ -15,46 +15,46 @@ export class MailService {
constructor(
private readonly sistemaService: SistemaService,
private readonly authService: AuthService,
@InjectRepository(Correo) private readonly correoRepository: Repository<Correo>,
@InjectRepository(Status) private readonly statusRepository: Repository<Status>,
@InjectRepository(Sistema) private readonly sistemaRepositosistemaRepositoryry: Repository<Sistema>
) {
/* this.transporter = nodemailer.createTransport({
host: 'smtp-relay.gmail.com',
port: 587,
secure: false,
requireTLS: true,
auth: {
user: process.env.USER_GMAIL,
pass: process.env.PASS_GMAIL,
},
}); */
private readonly sistemaService: SistemaService,
private readonly authService: AuthService,
@InjectRepository(Correo) private readonly correoRepository: Repository<Correo>,
@InjectRepository(Status) private readonly statusRepository: Repository<Status>,
@InjectRepository(Sistema) private readonly sistemaRepositosistemaRepositoryry: Repository<Sistema>
/*
this.transporter = nodemailer.createTransport({
host: 'smtp.gmail.com', // o smtprelay.gmail.com (ver punto 2)
port: 587,
secure: false,
requireTLS: true, // TLS STARTTLS
auth: { user: process.env.USER_GMAIL, pass: process.env.PASS_GMAIL },
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
});
) {
/* this.transporter = nodemailer.createTransport({
host: 'smtp-relay.gmail.com',
port: 587,
secure: false,
requireTLS: true,
auth: {
user: process.env.USER_GMAIL,
pass: process.env.PASS_GMAIL,
},
}); */
/*
this.transporter = nodemailer.createTransport({
host: 'smtp.gmail.com', // o smtprelay.gmail.com (ver punto 2)
port: 587,
secure: false,
requireTLS: true, // TLS STARTTLS
auth: { user: process.env.USER_GMAIL, pass: process.env.PASS_GMAIL },
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
});
*/
*/
/*
this.transporter = nodemailer.createTransport({
host: 'localhost',
@@ -64,81 +64,83 @@ export class MailService {
*/
}
async findAllBySistema(TOKEN:string,nombreSistema:string){
async findAllBySistema(TOKEN: string, nombreSistema: string) {
if (!TOKEN) {
throw new UnauthorizedException('Header "Password" es requerido');
}
const sistem=await this.sistemaService.acceso(TOKEN)
if(!sistem){
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}
},
relations: {
id_sistema: true,
id_status: true,
},}
const result = await this.correoRepository.find({
where: {
id_sistema: { nombre_sistema: nombreSistema }
},
relations: {
id_sistema: true,
id_status: true,
},
}
)
return result
}
}
async sendMail(sendEmail:SendCorreoDto,token:string) {
async sendMail(sendEmail: SendCorreoDto, token: string) {
console.log("token", token)
let payload
payload = await this.authService.verificarToken(token);
if (!payload || !payload.nombre) {
throw new UnauthorizedException('Token inválido o incompleto');
}
const sistem= await this.sistemaService.findByNombre(payload.nombre)
if(!sistem){
payload = await this.authService.verificarToken(token);
console.log("payload", payload)
if (!payload || !payload.nombre) {
throw new UnauthorizedException('Token inválido o incompleto');
}
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
);
const decryptedToken = decrypt(
sistem.refreshToken_encrypted,
sistem.refreshToken_iv
);
const decryptedPassword = decrypt(
sistem.email_password_encrypted,
sistem.email_password_iv
);
const decryptedToken = decrypt(
sistem.refreshToken_encrypted,
sistem.refreshToken_iv
);
const transporter = nodemailer.createTransport({
/* host: 'smtp.gmail.com', // o smtprelay.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
*/
/* host: 'smtp.gmail.com', // o smtprelay.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: {
@@ -154,56 +156,56 @@ async sendMail(sendEmail:SendCorreoDto,token:string) {
maxMessages: 100,
rateDelta: 2000,
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,
to:sendEmail.to,
subject:sendEmail.subject,
to: sendEmail.to,
subject: sendEmail.subject,
text: sendEmail.text,
html:sendEmail.html,
html: sendEmail.html,
// OJO: nodemailer usa 'attachments', no 'adjuntos'
attachments: (sendEmail.adjuntos || []).map((adj) => {
// Asegúrate de no incluir 'data:image/png;base64,' en 'content'
let base64Clean = adj.content;
// Si viene con prefijo "data:image...", lo quitamos
if (base64Clean.startsWith('data:image/')) {
base64Clean = base64Clean.split('base64,')[1];
}
return {
filename: adj.filename || 'qr.png',
content: Buffer.from(base64Clean, adj.encoding || 'base64'),
cid: adj.cid || 'qrCode', // el mismo que uses en <img src="cid:..."/>
contentType: 'image/png' // recomendable para que sepa que es PNG
};
})
// OJO: nodemailer usa 'attachments', no 'adjuntos'
attachments: (sendEmail.adjuntos || []).map((adj) => {
// Asegúrate de no incluir 'data:image/png;base64,' en 'content'
let base64Clean = adj.content;
// Si viene con prefijo "data:image...", lo quitamos
if (base64Clean.startsWith('data:image/')) {
base64Clean = base64Clean.split('base64,')[1];
}
return {
filename: adj.filename || 'qr.png',
content: Buffer.from(base64Clean, adj.encoding || 'base64'),
cid: adj.cid || 'qrCode', // el mismo que uses en <img src="cid:..."/>
contentType: 'image/png' // recomendable para que sepa que es PNG
};
})
};
console.log(mailOptions);
let resMail = await transporter.sendMail(mailOptions);
if(!resMail) throw new Error("")
let resMail = await transporter.sendMail(mailOptions);
if (!resMail) throw new Error("")
const statusTexto = resMail.accepted.length > 0 ? "Enviado" : "Fallido";
let status = await this.statusRepository.findOne({ where: { status: statusTexto } });
@@ -211,8 +213,8 @@ if(!resMail) throw new Error("")
status = this.statusRepository.create({ status: statusTexto });
await this.statusRepository.save(status);
}
const info= this.correoRepository.create({
const info = this.correoRepository.create({
id_status: status,
id_sistema: sistem,
fecha_recibido: sendEmail.fecha_recibido,
@@ -220,19 +222,19 @@ if(!resMail) throw new Error("")
destinatario: sendEmail.to,
remitente: sistem.email,
});
});
if(!resMail){
if (!resMail) {
throw new Error("fallo")
}
this.correoRepository.save(info);
return (statusTexto);
}
}