UNPKG

@decaf-ts/db-decorators

Version:

Agnostic database decorators and repository

75 lines 3.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isTransient = isTransient; exports.modelToTransient = modelToTransient; const repository_1 = require("./../repository/index.cjs"); const decorator_validation_1 = require("@decaf-ts/decorator-validation"); const constants_1 = require("./constants.cjs"); /** * @description Checks if a model is marked as transient * @summary Determines whether a model class has been decorated with the transient decorator * @template M - Type extending Model * @param {M} model - The model instance to check * @return {boolean} True if the model is transient, false otherwise * @function isTransient * @memberOf module:db-decorators */ function isTransient(model) { return !!(Reflect.getMetadata(repository_1.Repository.key(constants_1.DBKeys.TRANSIENT), model.constructor) || Reflect.getMetadata(repository_1.Repository.key(constants_1.DBKeys.TRANSIENT), decorator_validation_1.Model.get(model.constructor.name))); } /** * @description Separates transient properties from a model * @summary Extracts properties marked as transient into a separate object * @template M - Type extending Model * @param {M} model - The model instance to process * @return {Object} Object containing the model without transient properties and a separate transient object * @property {M} model - The model with transient properties removed * @property {Record<string, any>} [transient] - Object containing the transient properties * @function modelToTransient * @memberOf module:db-decorators * @mermaid * sequenceDiagram * participant Caller * participant modelToTransient * participant isTransient * participant getAllPropertyDecoratorsRecursive * * Caller->>modelToTransient: model * modelToTransient->>isTransient: check if model is transient * isTransient-->>modelToTransient: transient status * alt model is not transient * modelToTransient-->>Caller: {model} * else model is transient * modelToTransient->>getAllPropertyDecoratorsRecursive: get transient properties * getAllPropertyDecoratorsRecursive-->>modelToTransient: property decorators * modelToTransient->>modelToTransient: separate properties * modelToTransient->>Model.build: rebuild model without transient props * modelToTransient-->>Caller: {model, transient} * end */ function modelToTransient(model) { if (!isTransient(model)) return { model: model }; const decs = (0, repository_1.getAllPropertyDecoratorsRecursive)(model, undefined, repository_1.Repository.key(constants_1.DBKeys.TRANSIENT)); const result = Object.entries(decs).reduce((accum, [k, val]) => { const transient = val.find((el) => el.key === ""); if (transient) { accum.transient = accum.transient || {}; try { accum.transient[k] = model[k]; } catch (e) { throw new repository_1.SerializationError(`Failed to serialize transient property ${k}: ${e}`); } } else { accum.model = accum.model || {}; accum.model[k] = model[k]; } return accum; }, {}); result.model = decorator_validation_1.Model.build(result.model, model.constructor.name); return result; } //# sourceMappingURL=utils.js.map