alphascript-server
Version:
CRUD operations for mongo and other functionalities to get started quickly in any CMS project
71 lines (57 loc) • 2.09 kB
JavaScript
var api = require('../../');
module.exports = function (schema, options) {
options = options || {};
options.collection = options.collection || 'versions';
options.mongoose = options.mongoose || api.options.mongoose || require('mongoose');
options.connection = options.connection || options.mongoose;
options.ignorePaths = options.ignorePaths || [];
doVersioning(schema, options);
};
function doVersioning(schema, options) {
var versionedSchema = new options.mongoose.Schema({
refId: options.mongoose.Schema.Types.ObjectId,
versions: [new options.mongoose.Schema({}, api.schemaOptions())]
}, api.schemaOptions());
setSchemaOptions(versionedSchema, options);
var VersionedModel = options.connection.model(options.collection, versionedSchema);
schema.statics.versionedModel = VersionedModel;
schema.pre('save', saveVersion(VersionedModel, options));
}
function saveVersion(VersionedModel, options) {
return function saveVersion(next) {
//increment __v
this.increment();
var modifiedPaths = this.modifiedPaths();
if (modifiedPaths.length) {
var onlyIgnoredPathModified = modifiedPaths.every(function (path) {
return options.ignorePaths.indexOf(path) >= 0;
});
if (onlyIgnoredPathModified) {
return next();
}
}
var _id = this._id.toString();
var versionCopy = this.toObject({
depopulate: true,
retainKeyOrder: true,
transform: function (input, output) {
delete output._id;
for (var key in output) {
if (!(output[key] instanceof options.mongoose.Types.ObjectId)) continue;
output[key] = output[key].toString();
}
}
});
VersionedModel.findOneAndUpdate({ refId: _id }, { $set: { refId: _id }, $addToSet: { versions: versionCopy } }, { upsert: true, new: true }, function (err) {
if (err) console.log(err);
next();
});
};
}
function setSchemaOptions(schema, options) {
for (var key in options) {
if (options.hasOwnProperty(key)) {
schema.set(key, options[key]);
}
}
}