/** * Script: resend-welcome * * Genera una nueva contraseña temporal para el usuario y reenvía el correo * de bienvenida. Útil cuando el envío anterior falló o se perdió. * * Ejecución: * cd apps/api && npx tsx scripts/resend-welcome.ts */ import { PrismaClient } from '@prisma/client'; import bcrypt from 'bcryptjs'; import { randomBytes } from 'crypto'; import { emailService } from '../src/services/email/email.service.js'; const prisma = new PrismaClient(); const EMAIL = 'miguel.corona@corpcyl.com'; function generateTempPassword(length = 12): string { const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789'; let result = ''; const bytes = randomBytes(length); for (let i = 0; i < length; i++) { result += chars[bytes[i] % chars.length]; } return result + '!'; } async function main() { const user = await prisma.user.findUnique({ where: { email: EMAIL } }); if (!user) { console.error(`❌ No existe un usuario con el correo ${EMAIL}`); process.exit(1); } const tempPassword = generateTempPassword(); const passwordHash = await bcrypt.hash(tempPassword, 12); await prisma.user.update({ where: { id: user.id }, data: { passwordHash, tokenVersion: { increment: 1 }, }, }); console.log('⏳ Enviando correo de bienvenida a', EMAIL, '...'); await emailService.sendWelcome(EMAIL, { nombre: user.nombre, email: EMAIL, tempPassword, }); console.log('✅ Correo de bienvenida enviado'); console.log(' Nombre:', user.nombre); console.log(' Email:', EMAIL); console.log(' Contraseña temporal:', tempPassword); } main() .catch((e) => { console.error('\n❌ Error enviando correo:', e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });