UNPKG

ottoman

Version:
99 lines 5.41 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getPopulated = exports.setModelMetadata = exports.getModelMetadata = exports.modelMetadataSymbol = void 0; const couchbase_1 = require("couchbase"); const ottoman_errors_1 = require("../../exceptions/ottoman-errors"); const cast_strategy_1 = require("../../utils/cast-strategy"); const is_populate_object_1 = require("../../utils/populate/is-populate-object"); const schema_utils_1 = require("../../utils/schema.utils"); exports.modelMetadataSymbol = Symbol('modelMetadataSymbol'); const getModelMetadata = (modelConstructor) => modelConstructor[exports.modelMetadataSymbol]; exports.getModelMetadata = getModelMetadata; const setModelMetadata = (modelConstructor, metadata) => (modelConstructor[exports.modelMetadataSymbol] = metadata); exports.setModelMetadata = setModelMetadata; const getPopulated = (options) => __awaiter(void 0, void 0, void 0, function* () { var _a, _b, _c, _d; const { deep = 1, lean = false, schema, fieldsName, pojo, ottoman, modelName, enforceRefCheck = schema.options.enforceRefCheck, transactionContext, } = options; let isObject = false; let fieldsToPopulate; if (!fieldsName || fieldsName === '*') { fieldsToPopulate = (0, schema_utils_1.extractSchemaReferencesFields)(schema); } else { isObject = (0, is_populate_object_1.isPopulateAnObject)(fieldsName); fieldsToPopulate = (0, schema_utils_1.extractSchemaReferencesFromGivenFields)(isObject ? Object.keys(fieldsName !== null && fieldsName !== void 0 ? fieldsName : '') : fieldsName, schema); } const populateMaxDeep = deep - 1; if (populateMaxDeep >= 0) for (const field in fieldsToPopulate) { const refModel = (_a = fieldsToPopulate[field]) === null || _a === void 0 ? void 0 : _a.refModel; const ref = pojo[field]; if (refModel && ref) { const _SubModel = ottoman.getModel(refModel); const current = fieldsName === null || fieldsName === void 0 ? void 0 : fieldsName[field]; let select = ''; if (isObject && current !== '*' && (current === null || current === void 0 ? void 0 : current.select) !== '*') { if (typeof current === 'string') { select = current; } else if (Array.isArray(current)) { select = current.join(','); } else { select = (_b = (0, schema_utils_1.extractPopulateFieldsFromObject)(current)) !== null && _b !== void 0 ? _b : ''; } } const populate = populateMaxDeep === 0 ? undefined : (_d = (_c = current === null || current === void 0 ? void 0 : current.populate) !== null && _c !== void 0 ? _c : current) !== null && _d !== void 0 ? _d : '*'; const params = { select, lean, populateMaxDeep, populate, transactionContext }; if (Array.isArray(ref)) { const promises = []; const l = ref.length; let i = -1; while (++i < l) promises.push(processSubModel(_SubModel, ref[i], params, enforceRefCheck, field)); const response = yield Promise.all(promises); i = -1; while (++i < l) { ref[i] = response[i] || ref[i]; } } else { pojo[field] = (yield processSubModel(_SubModel, ref, params, enforceRefCheck, field)) || ref; } } } if (lean) return pojo; const _Model = ottoman.getModel(modelName); return new _Model(Object.assign({}, pojo), { strict: false, strategy: cast_strategy_1.CAST_STRATEGY.KEEP }).$wasNew(); }); exports.getPopulated = getPopulated; function processSubModel(model, ref, options, enforce, field) { return __awaiter(this, void 0, void 0, function* () { try { return yield model.findById(ref, options); } catch (e) { if (e instanceof couchbase_1.DocumentNotFoundError) { const msg = `Reference to '${field}' can't be populated cause document with id '${ref}' not found!`; switch (enforce) { case true: console.warn(msg); break; case 'throw': throw new ottoman_errors_1.InvalidModelReferenceError(msg); } } } }); } //# sourceMappingURL=model.utils.js.map