UNPKG

@decaf-ts/db-decorators

Version:

Agnostic database decorators and repository

94 lines 3.4 kB
"use strict"; 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