forest-cli
Version:
The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.
40 lines • 5.34 kB
JavaScript
const P = require('bluebird');
const { findCollectionMatchingSamples, filterReferenceCollection, } = require('../../../../utils/mongo-collections');
const OBJECT_ID_ARRAY = '[Mongoose.Schema.Types.ObjectId]';
const SAMPLE_COUNT_TO_FETCH = 10;
const SAMPLE_COUNT_TO_FETCH_ARRAY = 5;
const pickSampleValues = (databaseConnection, collectionName, field) => databaseConnection
.collection(collectionName)
.aggregate([
{ $project: { [field.name]: { $slice: [`$${field.name}`, SAMPLE_COUNT_TO_FETCH_ARRAY] } } },
{ $match: { [field.name]: { $ne: null } } },
{ $sample: { size: SAMPLE_COUNT_TO_FETCH } },
{ $unwind: `$${field.name}` },
{ $project: { _id: false, value: `$${field.name}` } },
])
.toArray()
.then(samples => samples.map(sample => sample.value));
const buildReference = (collectionName, referencedCollection, field) => {
if (referencedCollection) {
return {
from: { collectionName, fieldName: field.name },
to: { collectionName: referencedCollection },
};
}
return null;
};
const detectReference = (databaseConnection, field, collectionName) => pickSampleValues(databaseConnection, collectionName, field)
.then(samples => findCollectionMatchingSamples(databaseConnection, samples))
.then(matches => filterReferenceCollection(matches))
.then(referencedCollection => buildReference(collectionName, referencedCollection, field));
const detectHasMany = (databaseConnection, fields, collectionName) => {
const objectIdFields = fields.filter(field => field.type === OBJECT_ID_ARRAY);
return P.mapSeries(objectIdFields, objectIdField => detectReference(databaseConnection, objectIdField, collectionName)).then(references => references.filter(reference => reference));
};
const applyHasMany = (fields, references) => references.forEach(reference => {
const field = fields.find(searchedField => searchedField.name === reference.from.fieldName);
field.ref = reference.to.collectionName;
field.hasMany = true;
});
module.exports = { detectHasMany, applyHasMany };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ28taGFzbWFueS1hbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9zY2hlbWEvdXBkYXRlL2FuYWx5emVyL21vbmdvLWhhc21hbnktYW5hbHl6ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sRUFDSiw2QkFBNkIsRUFDN0IseUJBQXlCLEdBQzFCLEdBQUcsT0FBTyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFFbkQsTUFBTSxlQUFlLEdBQUcsa0NBQWtDLENBQUM7QUFDM0QsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLENBQUM7QUFFdEMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNyRSxrQkFBa0I7S0FDZixVQUFVLENBQUMsY0FBYyxDQUFDO0tBQzFCLFNBQVMsQ0FBQztJQUNULEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsRUFBRTtJQUMzRixFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7SUFDM0MsRUFBRSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsRUFBRTtJQUM1QyxFQUFFLE9BQU8sRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRTtJQUM3QixFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElB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