@malagu/typeorm
Version:
69 lines • 2.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTransactionalOption = exports.Transactional = exports.TransactionalOption = exports.Propagation = void 0;
const common_1 = require("../../common");
const context_1 = require("../context");
const utils_1 = require("../utils");
var Propagation;
(function (Propagation) {
Propagation[Propagation["Required"] = 0] = "Required";
Propagation[Propagation["RequiresNew"] = 1] = "RequiresNew";
})(Propagation = exports.Propagation || (exports.Propagation = {}));
var TransactionalOption;
(function (TransactionalOption) {
function is(option) {
return option && (option.name !== undefined || option.isolation !== undefined || option.readOnly !== undefined);
}
TransactionalOption.is = is;
})(TransactionalOption = exports.TransactionalOption || (exports.TransactionalOption = {}));
exports.Transactional = function (nameOrTransactionalOption) {
const { name, isolation, propagation, readOnly } = getTransactionalOption(nameOrTransactionalOption);
return (target, methodName, descriptor) => {
const originalMethod = descriptor.value;
descriptor.value = async function (...args) {
if (propagation === Propagation.Required) {
const em = context_1.OrmContext.getEntityManager(name);
if (em && em.queryRunner && (em.queryRunner.isTransactionActive || readOnly)) {
return originalMethod.apply(this, args);
}
}
const callback = async (entityManager) => {
context_1.OrmContext.pushEntityManager(name, entityManager);
try {
return await originalMethod.apply(this, args);
}
finally {
context_1.OrmContext.popEntityManager(name);
}
};
const conn = await utils_1.getConnection(name);
const manager = conn.manager;
if (readOnly) {
return callback(manager);
}
else if (isolation) {
return manager.transaction(isolation, callback);
}
else {
return manager.transaction(callback);
}
};
};
};
function getTransactionalOption(nameOrTransactionalOption) {
const defaultOption = {
name: common_1.DEFAULT_CONNECTION_NAME,
propagation: Propagation.Required,
readOnly: false
};
let option = defaultOption;
if (TransactionalOption.is(nameOrTransactionalOption)) {
option = Object.assign(Object.assign({}, defaultOption), nameOrTransactionalOption);
}
else if (nameOrTransactionalOption) {
option = Object.assign(Object.assign({}, defaultOption), { name: nameOrTransactionalOption });
}
return option;
}
exports.getTransactionalOption = getTransactionalOption;
//# sourceMappingURL=transactional.js.map