multibridge
Version:
A multi-database connection framework with centralized configuration
113 lines (112 loc) • 4.02 kB
JavaScript
;
/**
* Sequelize ORM adapter for MultiBridge
* Supports: PostgreSQL, MySQL
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSequelizeInstance = getSequelizeInstance;
exports.closeSequelizeInstance = closeSequelizeInstance;
exports.closeAllSequelizeInstances = closeAllSequelizeInstances;
const sequelize_1 = require("sequelize");
const base_1 = require("./base");
const loggers_1 = __importDefault(require("../utils/loggers"));
const errors_1 = require("../utils/errors");
// Cache for Sequelize instances per tenant
const sequelizeInstances = new Map();
/**
* Get or create a Sequelize instance for the current tenant
*
* @param options - Optional Sequelize configuration options
* @returns Sequelize instance configured for the current tenant
*
* @example
* ```typescript
* await runWithTenant(tenant, async () => {
* const sequelize = await getSequelizeInstance();
* const User = sequelize.define('User', { ... });
* await User.findAll();
* });
* ```
*/
async function getSequelizeInstance(options) {
const { tenant, connectionData, dbType } = await (0, base_1.getTenantConnection)();
// Validate database type
(0, base_1.validateORMSupport)(dbType, ["postgres", "mysql"]);
const cacheKey = `${tenant.appid}-${tenant.orgid}-${tenant.appdbname}`;
// Check cache
const cached = sequelizeInstances.get(cacheKey);
if (cached) {
loggers_1.default.debug(`Reusing cached Sequelize instance for ${cacheKey}`);
return cached;
}
// Create Sequelize instance based on database type
let sequelize;
if (dbType === "postgres") {
const pool = connectionData.connection;
const schema = connectionData.config?.schema || tenant.appdbname;
sequelize = new sequelize_1.Sequelize({
dialect: "postgres",
pool: pool, // Use MultiBridge's pool
schema: schema,
logging: options?.logging || false,
define: {
schema: schema,
...options?.define,
},
...options,
});
}
else if (dbType === "mysql") {
const pool = connectionData.connection;
const database = tenant.appdbname;
sequelize = new sequelize_1.Sequelize({
dialect: "mysql",
pool: pool, // Use MultiBridge's pool
database: database,
logging: options?.logging || false,
...options,
});
}
else {
throw new errors_1.ConnectionError(`Unsupported database type for Sequelize: ${dbType}`, {
dbType,
});
}
// Cache the instance
sequelizeInstances.set(cacheKey, sequelize);
loggers_1.default.info(`Created Sequelize instance for ${cacheKey}`, {
dbType,
schema: connectionData.config?.schema,
});
return sequelize;
}
/**
* Close Sequelize instance for a specific tenant
*/
async function closeSequelizeInstance(tenant) {
if (!tenant) {
const { tenant: currentTenant } = await (0, base_1.getTenantConnection)();
tenant = currentTenant;
}
const cacheKey = `${tenant.appid}-${tenant.orgid}-${tenant.appdbname}`;
const instance = sequelizeInstances.get(cacheKey);
if (instance) {
await instance.close();
sequelizeInstances.delete(cacheKey);
loggers_1.default.debug(`Closed Sequelize instance for ${cacheKey}`);
}
}
/**
* Close all Sequelize instances
*/
async function closeAllSequelizeInstances() {
const closePromises = Array.from(sequelizeInstances.values()).map((instance) => instance.close().catch((error) => {
loggers_1.default.warn(`Error closing Sequelize instance: ${error.message}`);
}));
await Promise.all(closePromises);
sequelizeInstances.clear();
loggers_1.default.info("All Sequelize instances closed");
}