UNPKG

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
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]); } } }