@joktec/mongo
Version:
JokTec - Mongo Service
73 lines • 2.76 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 (!(paranoidKey in indexOption.fields)) {
indexOption.fields[paranoidKey] = 1;
}
}
function buildIndex(options) {
const deletedAt = (0, lodash_1.get)(options, 'paranoid.deletedAt.name', 'deletedAt');
const injectIndex = (0, lodash_1.get)(options, 'paranoid.injectIndex', false);
const paranoid = options?.paranoid && injectIndex ? 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 (paranoid)
injectParanoid(idx, paranoid);
indexes.push(idx);
});
}
if (options?.unique) {
(0, utils_1.toArray)(options.unique).map(key => {
const opts = { unique: true, background: true, sparse: true };
const fields = {};
key.split(',').map(field => {
fields[field] = 1;
});
const idx = { fields, options: opts };
if (paranoid)
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 } };
if (paranoid)
injectParanoid(idx, paranoid);
indexes.push(idx);
}
if (options?.geoSearch) {
const fields = { [options.geoSearch]: '2dsphere' };
const idx = { fields, options: { background: true } };
if (paranoid)
injectParanoid(idx, paranoid);
indexes.push(idx);
}
if (options?.ttl) {
const ttlIndexes = (0, utils_1.toArray)(options.ttl).map(index => {
return { fields: { [index.field]: 1 }, options: { expires: index.expiry } };
});
indexes.push(...ttlIndexes);
}
(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