fix(api): evitar 500 al crear tenant con email existente + rate-limit trust proxy
- createTenant ahora reusa User si el email ya existe globalmente
(hace upsert de membership en vez de crear user duplicado)
- Arregla error de express-rate-limit con X-Forwarded-For:
app.set('trust proxy', 1) para que funcione detrás de Cloudflare
- Tipos de email templates actualizados para tempPassword nullable
This commit is contained in:
@@ -91,26 +91,41 @@ export async function createTenant(data: {
|
||||
}
|
||||
});
|
||||
|
||||
// 3. Create admin user with temp password
|
||||
const tempPassword = randomBytes(4).toString('hex'); // 8-char random
|
||||
const hashedPassword = await bcrypt.hash(tempPassword, 10);
|
||||
|
||||
// Get owner role ID from roles table (rol que asignamos al dueño del tenant al crearlo)
|
||||
// 3. Create or reuse admin user
|
||||
const ownerRol = await prisma.rol.findUnique({ where: { nombre: 'owner' } });
|
||||
if (!ownerRol) throw new Error('Rol owner no encontrado en la base de datos');
|
||||
|
||||
const user = await prisma.user.create({
|
||||
data: {
|
||||
email: data.adminEmail,
|
||||
passwordHash: hashedPassword,
|
||||
nombre: data.adminNombre,
|
||||
lastTenantId: tenant.id,
|
||||
},
|
||||
});
|
||||
let user = await prisma.user.findUnique({ where: { email: data.adminEmail } });
|
||||
let tempPassword: string | null = null;
|
||||
|
||||
// Crea membership owner del nuevo user en su tenant (fase 4 multi-tenant)
|
||||
await prisma.tenantMembership.create({
|
||||
data: {
|
||||
if (!user) {
|
||||
tempPassword = randomBytes(4).toString('hex'); // 8-char random
|
||||
const hashedPassword = await bcrypt.hash(tempPassword, 10);
|
||||
user = await prisma.user.create({
|
||||
data: {
|
||||
email: data.adminEmail,
|
||||
passwordHash: hashedPassword,
|
||||
nombre: data.adminNombre,
|
||||
lastTenantId: tenant.id,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
// User ya existe: actualizar lastTenantId y nombre si cambió
|
||||
await prisma.user.update({
|
||||
where: { id: user.id },
|
||||
data: {
|
||||
lastTenantId: tenant.id,
|
||||
...(data.adminNombre && data.adminNombre !== user.nombre ? { nombre: data.adminNombre } : {}),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// Crea membership owner del user en su tenant (fase 4 multi-tenant).
|
||||
// Si ya existía (re-invite a otro tenant), reactivar.
|
||||
await prisma.tenantMembership.upsert({
|
||||
where: { userId_tenantId: { userId: user.id, tenantId: tenant.id } },
|
||||
update: { rolId: ownerRol.id, isOwner: true, active: true },
|
||||
create: {
|
||||
userId: user.id,
|
||||
tenantId: tenant.id,
|
||||
rolId: ownerRol.id,
|
||||
|
||||
Reference in New Issue
Block a user