@joktec/mongo
Version:
JokTec - Mongo Service
71 lines • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildIndex = buildIndex;
const utils_1 = require("@joktec/utils");
const typegoose_1 = require("@typegoose/typegoose");
const lodash_1 = require("lodash");
function injectParanoid(indexOption, paranoidKey = 'deletedAt') {
if (!indexOption.options.partialFilterExpression) {
indexOption.options.partialFilterExpression = {};
}
if (indexOption.options.sparse)
delete indexOption.options.sparse;
Object.assign(indexOption.options.partialFilterExpression, { [paranoidKey]: { $type: 'null' } });
}
function buildIndex(options) {
const deletedAt = (0, lodash_1.get)(options, 'paranoid.deletedAt.name', 'deletedAt');
const paranoid = options?.paranoid ? deletedAt : null;
const indexes = [];
if (options?.index) {
(0, utils_1.toArray)(options.index).map(key => {
const fields = key.split(',').reduce((obj, curr) => {
obj[curr] = 1;
return obj;
}, {});
const idx = { fields, options: { background: true } };
if (options.paranoid)
injectParanoid(idx, paranoid);
indexes.push(idx);
});
}
if (options?.unique) {
(0, utils_1.toArray)(options.unique).map(key => {
const partialFilterExpression = {};
const opts = { unique: true, background: true, sparse: true };
const fields = {};
key.split(',').map(field => {
fields[field] = 1;
partialFilterExpression[field] = { $exists: true, $type: ['string', 'number', 'date', 'objectId'] };
});
const idx = { fields, options: opts };
if (options.paranoid) {
idx.options.partialFilterExpression = partialFilterExpression;
injectParanoid(idx, paranoid);
}
indexes.push(idx);
});
}
if (options?.textSearch) {
const fields = options.textSearch.split(',').reduce((obj, path) => {
obj[path] = 'text';
return obj;
}, {});
const idx = { fields, options: { background: true } };
indexes.push(idx);
}
if (options?.geoSearch) {
const fields = { [options.geoSearch]: '2dsphere' };
const idx = { fields, options: { background: true } };
if (options.paranoid)
injectParanoid(idx, paranoid);
indexes.push(idx);
}
(0, utils_1.toArray)(options?.customIndexes).map(idx => {
idx.options = { background: true, ...idx.options };
if (paranoid)
injectParanoid(idx, paranoid);
indexes.push(idx);
});
return indexes.map(idx => (0, typegoose_1.index)(idx.fields, idx.options));
}
//# sourceMappingURL=mongo.index.js.map