UNPKG

7.35 kBJavaScriptView Raw
1App = { mongocrud: {} };
2var mongoose = require('mongoose');
3var ObjectId = mongoose.Schema.Types.ObjectId;
4
5module.exports = {
6 init: function (app, settings, authenticate) {
7
8 if (settings.connection != null)
9 mongoose.connect(settings.connection);
10
11 App = app;
12 App.mongocrud = {};
13
14 apiDomain = settings.apidomain == null ? 'api' : settings.apidomain;
15 // Authenticate has {role: role, call: } (get,get-all,add,update,remove)
16 authenticate = authenticate == null ? function (a, c) { c(true); } : authenticate;
17 App.authenticate = authenticate;
18 },
19 ObjectId: ObjectId,
20 clean: function (obj) {
21 var newobj = {};
22 for (var param in obj) {
23 if (param.indexOf('_') != 0) {
24 newobj[param] = obj[param];
25 }
26 }
27 return newobj;
28 },
29 model: function (name, model) {
30 if (model == null) return App.mongocrud[name];
31
32 model.DateCreated = Date;
33 model.DateUpdated = Date;
34 model.CreatedByUser = Object;
35 model.ModifiedByUser = Object;
36 model.Active = Boolean;
37 var _model = mongoose.model(name, mongoose.Schema(model));;
38
39 App.mongocrud[name] = {
40 model: _model,
41 new: function (data, req) {
42 var req = req == null ? { body: {} } : req,
43 body = req.body;
44 var _data = {
45 CreatedByUser : req.user,
46 ModifiedByUser: req.user,
47 DateCreated : new Date(),
48 DateUpdated : new Date(),
49 Active : body.Active == null ? true : body.Active
50 };
51 for (var param in data) {
52 if (param.indexOf("_") != 0) {
53 _data[param] = data[param];
54 }
55 }
56 return new _model(_data);
57 },
58 push: function (array, relation, callback) {
59 var relation = relation,
60 array = array,
61 callback = callback;
62
63 var model = relation.model == null ? _model:relation.model;
64 relation.data.save(function (err, transaction) {
65 if (err) return callback(err, null);
66 var pushdata = { $push: {} };
67 pushdata.$push[array] = transaction._id;
68
69 model.update({ _id: relation._id }, pushdata, function (err, data) {
70 if (err) return callback(err, null);
71 callback(null, data);
72 });
73 });
74 }
75
76 }
77
78
79 return {
80 crud: function (crud) {
81 crud = crud == null ? {} : crud;
82 crud.url = crud.url == null ? "/" + name : crud.url;
83 crud.role = crud.role == null ? 'none' : crud.role;
84 crud.exclude = crud.exclude == null ? [] : crud.exclude;
85 crud.populate = crud.populate == null ? {} : crud.populate;
86 crud.custom = crud.custom == null ? {} : crud.custom;
87 module.exports.crud(_model, crud);
88 },
89 model: _model,
90 name: name
91 };
92 },
93 error: function (res, err, data) {
94 res.status(500);
95 res.end(JSON.stringify({ error: err, data: data }))
96 },
97 crud: function (Model, crud) {
98 var model = Model;
99 var modelBase = module.exports.model(Model.modelName);
100 var error = module.exports.error;
101
102 crud.exclude = crud.exclude == null ? [] : crud.exclude;
103 crud.populate = crud.populate == null ? {} : crud.populate;
104 crud.url = "/" + apiDomain + crud.url;
105
106 var validate = function (call, then) {
107 call.res.setHeader('Content-Type', 'application/json');
108 var then = then;
109 call.role = crud.role;
110 call.url = crud.url;
111 call.model = model;
112
113 App.authenticate(call, function (validated) {
114 if (validated) {
115
116 then(call);
117 } else {
118 res.end(JSON.stringify({ error: "Authentication Failed", call: url, model: object.name }));
119 }
120 })
121 }
122 var populate = function (search, call) {
123 var populate = crud.populate[call];
124 if (populate == null) populate = [];
125 for (var i = 0; i < populate.length; i++) {
126 search.populate(populate[i], null, { Active: true });
127 }
128 }
129
130 var update = function (req, res, call) {
131 validate({ call: 'update', req: req, res: res }, function (params) {
132 var model = req.body;
133 var _id = model._id;
134 delete model._id;
135 for (var prop in model) {
136 if (prop.indexOf('_') != -1)
137 delete model[prop];
138 }
139
140 model.ModifiedByUser = params.user;
141 model.DateUpdated = new Date();
142 model.Active = model.Active == null ? true : model.Active;
143
144 Model.update({ _id: _id }, { $set: model }, function (err, data) {
145 if (err) return error(res, err, data);
146 res.end(JSON.stringify(data));
147 });
148 });
149 }
150
151 if (crud.exclude.indexOf('find-one') == -1)
152 App.post(crud.url + '/find-one', function (req, res) {
153 var req = req,
154 res = res;
155 validate({ call: 'find-one', req: req, res: res }, function () {
156 params = req.body;
157 var hasparams = false;
158 for (var param in params) {
159 if (param.indexOf('_') != 0)
160 hasparams = true;
161 }
162 if (!hasparams) {
163 return error(res, { error: crud.url + '/find-one requires at least one parameter to match a record' }, params);
164 }
165
166 var search = Model.findOne(params);
167 populate(search, 'find-one');
168 search.exec(function (err, data) {
169 if (err) return error(res, err, data);
170 res.end(JSON.stringify(data));
171 });
172 });
173 });
174
175 if (crud.exclude.indexOf('find') == -1)
176 App.post(crud.url + '/find', function (req, res) {
177 validate({ call: 'find', req: req, res: res }, function (params) {
178 params = req.body;
179 params.Active = params.Active == null ? true:params.Active;
180 var search = Model.find(params);
181 populate(search, 'find');
182 search.exec(function (err, data) {
183 if (err) return error(res, err, data);
184 res.end(JSON.stringify(data));
185 });
186 });
187 });
188
189 if (crud.exclude.indexOf('add') == -1)
190 App.post(crud.url + '/add', function (req, res) {
191 validate({ call: 'add', req: req, res: res }, function (params) {
192 var body = JSON.parse(JSON.stringify(req.body));
193 var data = {
194 CreatedByUser : params.user,
195 ModifiedByUser: params.user,
196 DateCreated : new Date(),
197 DateUpdated : new Date(),
198 Active : body.Active == null ? true : body.Active
199 };
200
201 for (var prop in body) {
202 if (prop.indexOf('-') == -1)
203 data[prop] = body[prop];
204 }
205
206 var model = new Model(data);
207
208 model.save(function (err, data) {
209 if (err) return error(res, err, data);
210 res.end(JSON.stringify(data));
211 });
212 });
213 });
214
215 if (crud.exclude.indexOf('update') == -1)
216 App.post(crud.url + '/update', function (req, res) {
217 update(req, res, 'update');
218 });
219
220 if (crud.exclude.indexOf('remove') == -1)
221 App.post(crud.url + '/remove', function (req, res) {
222 req.body = {
223 _id: req.body._id,
224 Active: false
225 };
226 update(req, res, 'remove');
227 });
228
229 for (var param in crud.custom) {
230 if (param.indexOf('_') != 0) {
231 var value = crud.custom[param];
232 if (typeof value == 'function') {
233 App.post(crud.url + '/' + param, function (req, res) {
234 var req = req,
235 res = res;
236 validate({ call: param, req: req, res: res }, function (params) {
237 res.json = function (data) {
238 res.end(JSON.stringify(data));
239 }
240 value(req, res, modelBase);
241 });
242 });
243 }
244 }
245 }
246 },
247};