@decaf-ts/db-decorators
Version:
Agnostic database decorators and repository
94 lines • 3.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.reduceErrorsToPrint = reduceErrorsToPrint;
exports.enforceDBDecorators = enforceDBDecorators;
exports.getDbDecorators = getDbDecorators;
const constants_1 = require("./../operations/constants.cjs");
const errors_1 = require("./errors.cjs");
const decorators_1 = require("./../operations/decorators.cjs");
const decoration_1 = require("@decaf-ts/decoration");
function reduceErrorsToPrint(errors) {
return errors.reduce((accum, e, i) => {
if (e)
accum =
typeof accum === "string"
? accum + `\n - ${i}: ${e.toString()}`
: ` - ${i}: ${e.toString()}`;
return accum;
}, undefined);
}
/**
*
* @param {IRepository<T>} repo
* @param context
* @param {T} model
* @param operation
* @param prefix
*
* @param oldModel
* @function enforceDBPropertyDecoratorsAsync
*
* @memberOf db-decorators.utils
*/
async function enforceDBDecorators(repo, context, model, operation, prefix, oldModel) {
const decorators = getDbDecorators(model, operation, prefix);
if (!decorators)
return;
const hanlersDecorators = (0, decorators_1.getHandlersDecorators)(model, decorators, prefix);
const groupedDecorators = (0, decorators_1.groupDecorators)(hanlersDecorators);
const sortedDecorators = (0, decorators_1.sortDecorators)(groupedDecorators);
for (const dec of sortedDecorators) {
const args = [
context,
dec.data.length > 1 ? dec.data : dec.data[0],
dec.prop.length > 1 ? dec.prop : dec.prop[0],
model,
];
if ([constants_1.OperationKeys.UPDATE, constants_1.BulkCrudOperationKeys.UPDATE_ALL].includes(operation)) {
if (!oldModel)
throw new errors_1.InternalError("Missing old model for update operation");
args.push(oldModel);
}
try {
await dec.handler.apply(repo, args);
}
catch (e) {
const msg = `Failed to execute handler ${dec.handler.name} for ${dec.prop} on ${model.constructor.name} due to error: ${e}`;
if (context.get("breakOnHandlerError"))
throw new errors_1.InternalError(msg);
context.logger.for(enforceDBDecorators).error(msg);
}
}
}
/**
* Specific for DB Decorators
* @param {T} model
* @param {string} operation CRUD {@link OperationKeys}
* @param {string} [extraPrefix]
*
* @function getDbPropertyDecorators
*
* @memberOf db-decorators.utils
*/
function getDbDecorators(model, operation, extraPrefix) {
const prefix = extraPrefix?.replace(/[.]$/, "");
const decorators = decoration_1.Metadata.get(model.constructor, constants_1.ModelOperations.OPERATIONS);
if (!decorators)
return;
return Object.keys(decorators).reduce((accum, decorator) => {
const obj = prefix
? decorators[decorator][prefix] || {}
: decorators[decorator];
const dec = Object.keys(obj).filter((d) => d === operation);
const decs = [];
for (const d of dec)
decs.push({ key: d, props: obj[d] });
if (decs && decs.length) {
if (!accum)
accum = {};
accum[decorator] = decs;
}
return accum;
}, undefined);
}
//# sourceMappingURL=utils.js.map