ultima versión
This commit is contained in:
@@ -7,7 +7,7 @@ export class AuthService {
|
||||
|
||||
generarToken(payload: any) {
|
||||
return this.jwtService.sign(payload, {
|
||||
secret: process.env.JWT_SECRET, // <-- Aquí lo defines explícitamente
|
||||
secret: process.env.JWT_SECRET,
|
||||
expiresIn: '1d',
|
||||
});
|
||||
}
|
||||
@@ -15,7 +15,7 @@ export class AuthService {
|
||||
verificarToken(token: string) {
|
||||
try {
|
||||
return this.jwtService.verify(token, {
|
||||
secret: process.env.JWT_SECRET, // <-- También aquí
|
||||
secret: process.env.JWT_SECRET,
|
||||
});
|
||||
} catch {
|
||||
return null;
|
||||
|
||||
+12
-28
@@ -2,23 +2,14 @@ import {
|
||||
Controller,
|
||||
Post,
|
||||
Body,
|
||||
UploadedFile,
|
||||
Headers,
|
||||
UnauthorizedException,
|
||||
Get,
|
||||
UseInterceptors,
|
||||
} from '@nestjs/common';
|
||||
import { MailService } from './mail.service';
|
||||
import { ExcelService } from 'src/excel/excel.service';
|
||||
import { ApiTags } from '@nestjs/swagger';
|
||||
import { ApiSendMail} from './mail.decorators';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Sistema } from 'src/typeorm/entidades';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { SistemaService } from 'src/sistema/sistema.service';
|
||||
import { JwtService } from '@nestjs/jwt';
|
||||
import { SendCorreoDto } from 'src/mail/dto/send-email.dto';
|
||||
import { FileInterceptor } from '@nestjs/platform-express';
|
||||
import { AuthService } from 'src/auth/auth.service';
|
||||
|
||||
|
||||
@@ -47,26 +38,19 @@ export class MailController {
|
||||
if (!headers.token) {
|
||||
throw new UnauthorizedException('Header "token" es requerido');
|
||||
}
|
||||
let payload
|
||||
|
||||
payload = await this.authService.verificarToken(headers.token);
|
||||
|
||||
|
||||
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 result = await this.mailService.sendMail(body,sistem); // sistem
|
||||
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;
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { Injectable, UnauthorizedException } from '@nestjs/common';
|
||||
import * as nodemailer from 'nodemailer';
|
||||
import * as dotenv from 'dotenv';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Correo, Sistema, Status } from '../typeorm/entidades';
|
||||
@@ -13,7 +12,7 @@ import { decrypt } from '../crypto/crypto.util';
|
||||
|
||||
@Injectable()
|
||||
export class MailService {
|
||||
private transporter;
|
||||
|
||||
|
||||
constructor(
|
||||
private readonly sistemaService: SistemaService,
|
||||
@@ -91,10 +90,25 @@ export class MailService {
|
||||
},}
|
||||
)
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
async sendMail(sendEmail:SendCorreoDto,sistem:Sistema,) {
|
||||
async sendMail(sendEmail:SendCorreoDto,token:string) {
|
||||
|
||||
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){
|
||||
throw new UnauthorizedException('sistema No encontrado');
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -104,10 +118,17 @@ export class MailService {
|
||||
sistem.email_password_iv
|
||||
);
|
||||
|
||||
const decryptedToken = decrypt(
|
||||
sistem.refreshToken_encrypted,
|
||||
sistem.refreshToken_iv
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const transporter = nodemailer.createTransport({
|
||||
host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2)
|
||||
/* host: 'smtp.gmail.com', // o smtp‑relay.gmail.com (ver punto 2)
|
||||
port: 587,
|
||||
secure: false,
|
||||
requireTLS: true, // TLS STARTTLS
|
||||
@@ -117,6 +138,24 @@ export class MailService {
|
||||
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',
|
||||
user: sistem.email,
|
||||
clientId: sistem.clientId,
|
||||
clientSecret: decryptedPassword,
|
||||
refreshToken: decryptedToken,
|
||||
//accessToken: sistem.accessToken, // opcional
|
||||
},
|
||||
pool: true,
|
||||
maxConnections: 1,
|
||||
maxMessages: 100,
|
||||
rateDelta: 2000,
|
||||
rateLimit: 1
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
@@ -159,6 +198,9 @@ export class MailService {
|
||||
|
||||
|
||||
let resMail = await transporter.sendMail(mailOptions);
|
||||
if(!resMail) throw new Error("")
|
||||
|
||||
|
||||
const statusTexto = resMail.accepted.length > 0 ? "Enviado" : "Fallido";
|
||||
|
||||
|
||||
@@ -176,11 +218,11 @@ export class MailService {
|
||||
fecha_recibido: sendEmail.fecha_recibido,
|
||||
fecha_enviado: new Date(),
|
||||
destinatario: sendEmail.to,
|
||||
remitente: process.env.USER_GMAIL,
|
||||
remitente: sistem.email,
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
if(!resMail){
|
||||
throw new Error("fallo")
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ export class CreateSistemaDto {
|
||||
@IsString()
|
||||
ip:string;
|
||||
|
||||
//Password del sistema
|
||||
@IsNotEmpty()
|
||||
@IsString()
|
||||
password: string;
|
||||
@@ -17,10 +18,20 @@ export class CreateSistemaDto {
|
||||
@IsString()
|
||||
email: string;
|
||||
|
||||
//clientSecret
|
||||
@IsNotEmpty()
|
||||
@IsString()
|
||||
email_password:string
|
||||
|
||||
|
||||
@IsNotEmpty()
|
||||
@IsString()
|
||||
clientId:string
|
||||
|
||||
//TU_REFRESH_TOKEN
|
||||
@IsNotEmpty()
|
||||
@IsString()
|
||||
refreshToken:string;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -46,14 +46,23 @@ export class SistemaService {
|
||||
throw new UnauthorizedException('Password erróneo');
|
||||
}
|
||||
|
||||
const { encryptedData, iv } = encrypt(createSistemaDto.email_password);
|
||||
const {encryptedData:encryptedData_token,iv:encryptedData_iv}= encrypt(createSistemaDto.refreshToken)
|
||||
|
||||
const { encryptedData:encrypted_password, iv:iv_password } = encrypt(createSistemaDto.email_password);
|
||||
|
||||
const sistema = this.sistemaRepository.create({
|
||||
nombre_sistema: createSistemaDto.Nombre,
|
||||
ip: createSistemaDto.ip,
|
||||
email:createSistemaDto.email,
|
||||
email_password_encrypted: encryptedData,
|
||||
email_password_iv: iv
|
||||
email_password_encrypted: encrypted_password,
|
||||
email_password_iv: iv_password,
|
||||
clientId: createSistemaDto.clientId,
|
||||
refreshToken_encrypted:encryptedData_token,
|
||||
refreshToken_iv: encryptedData_iv
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
await this.sistemaRepository.save(sistema);
|
||||
|
||||
|
||||
@@ -6,21 +6,34 @@ export class Sistema {
|
||||
@PrimaryGeneratedColumn()
|
||||
id_sistema: number;
|
||||
|
||||
@Column({ type: 'varchar', length: 50 })
|
||||
@Column({ type: 'varchar', length: 50, nullable: false })
|
||||
nombre_sistema: string;
|
||||
|
||||
@Column({ type: 'varchar', length: 50 })
|
||||
@Column({ type: 'varchar', length: 50,nullable: false })
|
||||
ip:string;
|
||||
|
||||
@Column()
|
||||
@Column({nullable: false})
|
||||
email: string;
|
||||
|
||||
@Column()
|
||||
//clientSecret encriptada
|
||||
@Column({nullable: false})
|
||||
email_password_encrypted: string;
|
||||
|
||||
|
||||
@Column()
|
||||
@Column({nullable: false})
|
||||
email_password_iv: string;
|
||||
|
||||
@Column({nullable: false})
|
||||
clientId:string
|
||||
|
||||
//TU_REFRESH_TOKEN
|
||||
@Column({nullable: false})
|
||||
refreshToken_encrypted:string;
|
||||
|
||||
@Column({nullable: false})
|
||||
refreshToken_iv: string;
|
||||
|
||||
|
||||
@OneToMany(() => Correo, (correo) => correo.id_sistema)
|
||||
correos: Correo[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user