1 | App = { mongocrud: {} };
|
2 | var mongoose = require('mongoose');
|
3 | var ObjectId = mongoose.Schema.Types.ObjectId;
|
4 |
|
5 | module.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 |
|
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 | };
|