@tsrt/typeorm-transactions
Version:
TypeORM convenient transactions management
109 lines • 5.39 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.insertEntityProperties = exports.getEntityColumns = exports.insertIntoClass = exports.getConnection = exports.removeManagerFromNs = exports.getManagerFromNs = exports.setManagerIntoNs = exports.execInTransactionsNamespace = exports.bindTransactionsNamespace = exports.getTransactionsNamespace = exports.createTransactionsNamespace = void 0;
/* eslint-disable @typescript-eslint/ban-types */
/* eslint-disable max-classes-per-file */
const typeorm_1 = require("typeorm");
const cls_hooked_1 = require("cls-hooked");
const NAMESPACE = '__typeorm_transactions_namespace__';
const TRANSACTION_KEY = '__typeorm_transaction_key__';
// Cls Namespace related utils
function createTransactionsNamespace() {
var _a;
return (_a = cls_hooked_1.getNamespace(NAMESPACE)) !== null && _a !== void 0 ? _a : cls_hooked_1.createNamespace(NAMESPACE);
}
exports.createTransactionsNamespace = createTransactionsNamespace;
function getTransactionsNamespace() {
return cls_hooked_1.getNamespace(NAMESPACE);
}
exports.getTransactionsNamespace = getTransactionsNamespace;
function bindTransactionsNamespace(req, res, next) {
const ns = createTransactionsNamespace();
ns.bindEmitter(req);
ns.bindEmitter(res);
ns.run(() => next());
}
exports.bindTransactionsNamespace = bindTransactionsNamespace;
function execInTransactionsNamespace(cb) {
return __awaiter(this, void 0, void 0, function* () {
const ns = createTransactionsNamespace();
// Call `runPromise` only if there is no `active` namespace yet, as there are context loss problems
// running `runPromise` inside another `runPromise`.
const runner = ns.active ? ns.runAndReturn.bind(ns) : ns.runPromise.bind(ns);
return runner(cb);
});
}
exports.execInTransactionsNamespace = execInTransactionsNamespace;
function setManagerIntoNs(connectionName, manager) {
const ns = getTransactionsNamespace();
if (ns && ns.active)
return ns.set(`${TRANSACTION_KEY}_${connectionName}`, manager);
}
exports.setManagerIntoNs = setManagerIntoNs;
function getManagerFromNs(connectionName) {
const ns = getTransactionsNamespace();
if (ns && ns.active)
return ns.get(`${TRANSACTION_KEY}_${connectionName}`);
}
exports.getManagerFromNs = getManagerFromNs;
function removeManagerFromNs(connectionName) {
const ns = getTransactionsNamespace();
if (ns && ns.active)
return ns.set(`${TRANSACTION_KEY}_${connectionName}`, null);
}
exports.removeManagerFromNs = removeManagerFromNs;
// TypeORM related utils
function getConnection(connectionFactory, connectionNameFactory) {
const connection = typeof connectionFactory === 'function' ? connectionFactory() : connectionFactory;
const connectionName = typeof connectionNameFactory === 'function' ? connectionNameFactory() : connectionNameFactory;
const result = connection !== null && connection !== void 0 ? connection : typeorm_1.getConnection(connectionName);
if (!result.isConnected)
throw new Error('Please, initialize TypeORM connection.');
return result;
}
exports.getConnection = getConnection;
function insertIntoClass(context, data) {
if (!data || !context)
throw new Error('It is necessary to provide both: data and context');
Object.entries(data).forEach(([key, value]) => {
if (!Object.prototype.hasOwnProperty.call(data, key))
return;
// eslint-disable-next-line no-param-reassign
context[key] = value;
});
}
exports.insertIntoClass = insertIntoClass;
function getPrototypes(target) {
var _a;
let result = [target];
if ((_a = Object.getPrototypeOf(target)) === null || _a === void 0 ? void 0 : _a.name)
result = result.concat(getPrototypes(Object.getPrototypeOf(target)));
return result;
}
function getEntityColumns(target) {
let result = [];
getPrototypes(target).forEach((item) => { result = result.concat(typeorm_1.getMetadataArgsStorage().filterColumns(item)); });
return result;
}
exports.getEntityColumns = getEntityColumns;
function insertEntityProperties(context, data) {
var _a;
if (!data)
return;
const properties = (_a = getEntityColumns(context.constructor)) === null || _a === void 0 ? void 0 : _a.map(({ propertyName }) => propertyName);
const filteredData = {};
Object.entries(data).forEach(([key, value]) => { if (properties === null || properties === void 0 ? void 0 : properties.includes(key))
filteredData[key] = value; });
insertIntoClass(context, filteredData);
}
exports.insertEntityProperties = insertEntityProperties;
//# sourceMappingURL=utils.js.map