ottoman
Version:
Ottoman Couchbase ODM
99 lines • 5.41 kB
JavaScript
;
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