/** * Script: change-user-email * * Cambia el correo de un usuario, resetea su contraseña a una temporal * y reenvía el correo de bienvenida con las nuevas credenciales. * * Ejecución: * cd apps/api && npx tsx scripts/change-user-email.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 OLD_EMAIL = 'eduardo.corona@corpcyl.com'; const NEW_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: OLD_EMAIL } }); if (!user) { console.error(`❌ No existe un usuario con el correo ${OLD_EMAIL}`); process.exit(1); } const existing = await prisma.user.findUnique({ where: { email: NEW_EMAIL } }); if (existing) { console.error(`❌ Ya existe un usuario con el correo ${NEW_EMAIL}`); process.exit(1); } const tempPassword = generateTempPassword(); const passwordHash = await bcrypt.hash(tempPassword, 12); await prisma.user.update({ where: { id: user.id }, data: { email: NEW_EMAIL, passwordHash, tokenVersion: { increment: 1 }, }, }); await emailService.sendWelcome(NEW_EMAIL, { nombre: user.nombre, email: NEW_EMAIL, tempPassword, }); console.log('✅ Correo actualizado:', OLD_EMAIL, '→', NEW_EMAIL); console.log('✅ Contraseña temporal generada y enviada por correo'); console.log(' Nombre:', user.nombre); console.log(' Email:', NEW_EMAIL); console.log(' Contraseña temporal:', tempPassword); } main() .catch((e) => { console.error('\n❌ Error:', e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });