@nestjs-cls/transactional
Version:
A nestjs-cls plugin for transactional decorators
60 lines (59 loc) • 2.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Transactional = Transactional;
/* eslint-disable @typescript-eslint/no-unused-vars */
const nestjs_cls_1 = require("nestjs-cls");
const propagation_1 = require("./propagation");
const transaction_host_1 = require("./transaction-host");
function Transactional(firstParam, secondParam, thirdParam) {
let connectionName;
let options;
let propagation;
if (thirdParam) {
connectionName = firstParam;
propagation = secondParam;
options = thirdParam;
}
else if (secondParam) {
if (paramIsPropagationMode(firstParam)) {
propagation = firstParam;
}
else {
connectionName = firstParam;
}
if (paramIsPropagationMode(secondParam)) {
propagation = secondParam;
}
else {
options = secondParam;
}
}
else {
if (paramIsPropagationMode(firstParam)) {
propagation = firstParam;
}
else if (typeof firstParam === 'string') {
connectionName = firstParam;
}
else {
options = firstParam;
}
}
return ((target, propertyKey, descriptor) => {
const original = descriptor.value;
if (typeof original !== 'function') {
throw new Error(`The @Transactional decorator can be only used on functions, but ${propertyKey.toString()} is not a function.`);
}
descriptor.value = new Proxy(original, {
apply: function (_, outerThis, args) {
const transactionHost = transaction_host_1.TransactionHost.getInstance(connectionName);
return transactionHost.withTransaction(propagation, options, original.bind(outerThis, ...args));
},
});
(0, nestjs_cls_1.copyMethodMetadata)(original, descriptor.value);
});
}
function paramIsPropagationMode(param) {
return (typeof param === 'string' &&
Object.values(propagation_1.Propagation).includes(param));
}