@decaf-ts/db-decorators
Version:
Agnostic database decorators and repository
75 lines • 3.36 kB
JavaScript
;
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