Delete schema-manager.ts (replaced by TenantConnectionManager). Remove deprecated tenantSchema from Express Request interface. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
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' });
|
|
}
|
|
}
|