UNPKG

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