import type { Request, Response, NextFunction } from 'express'; import type { Pool } from 'pg'; import { prisma, tenantDb } from '../config/database.js'; declare global { namespace Express { interface Request { tenantPool?: Pool; viewingTenantId?: string; } } } export async function tenantMiddleware(req: Request, res: Response, next: NextFunction) { try { if (!req.user) { return res.status(401).json({ message: 'No autenticado' }); } let tenantId = req.user.tenantId; let databaseName = req.user.databaseName; // Admin impersonation via X-View-Tenant header const viewTenantHeader = req.headers['x-view-tenant'] as string; if (viewTenantHeader && req.user.role === 'admin') { const viewedTenant = await prisma.tenant.findFirst({ where: { OR: [ { id: viewTenantHeader }, { rfc: viewTenantHeader }, ], }, select: { id: true, databaseName: true, active: true }, }); if (!viewedTenant) { return res.status(404).json({ message: 'Tenant no encontrado' }); } if (!viewedTenant.active) { return res.status(403).json({ message: 'Tenant inactivo' }); } tenantId = viewedTenant.id; databaseName = viewedTenant.databaseName; req.viewingTenantId = viewedTenant.id; } req.tenantPool = tenantDb.getPool(tenantId, databaseName); next(); } catch (error) { console.error('[TenantMiddleware] Error:', error); return res.status(500).json({ message: 'Error al resolver tenant' }); } }