mean-shadow
Version:
Allows any mean app to have endpoints to add/remove entities from any third party app
165 lines (140 loc) • 4.92 kB
JavaScript
var mongoose = require('mongoose'),
_ = require('lodash'),
db = mongoose.connections[0].db,
EventEmitter = require('events').EventEmitter,
shadowEvents = new EventEmitter();
var collections = {};
module.exports = function (app, options) {
var meanShadow = {
events: shadowEvents,
insert: function (req, res) {
var name = req.params.type;
var query = req.mongoQuery;
var Collection = getCollection(name);
Collection.findOne(query, function (err, doc) {
if (err) {
res.send(err);
}
else if (doc) {
compare(doc, req.body, function (equals) {
if (!equals) {
doc = _.assign(doc, req.body);
Collection.save(doc, function (err, numAffected) {
shadowEvents.emit('update', {
data: req.body,
doc: doc,
error: err
});
res.send({
err: err,
doc: doc
});
});
} else {
shadowEvents.emit('update', {
data: req.body,
doc: doc,
error: "exists"
});
res.send("equals");
}
});
} else {
Collection.save(req.body, function (err, doc) {
shadowEvents.emit('insert', {
data: req.body,
doc: doc,
error: err
});
res.send({
err: err,
doc: doc
});
});
}
});
},
remove: function (req, res) {
var name = req.params.type;
var query = req.mongoQuery;
var Collection = getCollection(name);
Collection.remove(query, function (err) {
if (err) {
res.send(err);
}
shadowEvents.emit('remove', {
data: query
});
res.send("Delete");
});
},
checkIds: function(req, res, next) {
req.mongoQuery = {};
var obj = {};
var paramsID = req.params.id;
var keyIDParams = paramsID.split("+");
for (var i = 0; i < keyIDParams.length; i++) {
req.mongoQuery[keyIDParams[i]] = req.body[keyIDParams[i]];
}
next();
}
};
if (options) {
if (options.disableAuth) {
app.post('/insert/:type/:id/:val', meanShadow.checkIds, meanShadow.insert);
app.del('/delete/:type/:id/:val', meanShadow.checkIds, meanShadow.remove);
}
else if (options.authMiddleware) {
app.post('/insert/:type/:id/:val', options.authMiddleware, meanShadow.checkIds, meanShadow.insert);
app.del('/delete/:type/:id/:val', options.authMiddleware, meanShadow.checkIds, meanShadow.remove);
}
else {
console.log("****************************************");
console.log("** **");
console.log("** WARNING **");
console.log("** Authorization is disabled **");
console.log("** Make sure to pass auth middleware **");
console.log("** When you require mean-shadow **");
console.log("** **");
console.log("****************************************");
}
}
return meanShadow;
};
function compare(a, b, callback) {
var temp = {
a: {},
b: {}
};
temp.a._id = a._id;
temp.a._v = a._v;
temp.b._id = b._id;
temp.b._v = b._v;
delete a._id;
delete a._v;
delete b._id;
delete b._v;
var equals = _.isEqual(a, b);
if (temp.a._id) {
a._id = temp.a._id;
}
if (temp.a._v !== 'undefined') {
a._v = temp.a._v;
}
if (temp.b._id) {
b._id = temp.b._id;
}
if (temp.b._v !== 'undefined') {
b._v = temp.b._v;
}
if (!callback) {
return equals;
}
return callback(equals);
}
function getCollection(name) {
if (!collections[name]) {
collections[name] = db.collection(name);
}
return collections[name];
}