Initial import
[darksolar] / api / routes / package.js
1 var Package = require ('../package');
2 var RadiusSyncPg = require ('../radiussync/postgresql');
3 var Q = require ('q');
4
5 var PackageRoutes = function () {
6 };
7
8 PackageRoutes.prototype.initRoutes = function (app) {
9   /* Tpl */
10   app.get ('/api/package/template/selectlist', this.getTplSelectList);
11   app.get ('/api/package/template', this.getTplAll);
12   app.get ('/api/package/template/:id', this.getTpl);
13   app.post ('/api/package/template', this.addTpl,
14                                      this.replyclient);
15   app.put ('/api/package/template/:id', this.updateTpl,
16                                         this.replyclient);
17   app.delete ('/api/package/template/:id', this.deleteTpl,
18                                            this.replyclient);
19
20   /* Inherit */
21   app.get ('/api/package/inheritance', this.getInheritAll);
22   app.get ('/api/package/inheritance/:id', this.getInherit);
23   app.post ('/api/package/inheritance', this.addInherit,
24                                         this.radiusSync,
25                                         this.replyclient);
26   app.put ('/api/package/inheritance/:id', this.updateInherit,
27                                            this.radiusSync,
28                                            this.replyclient);
29   app.delete ('/api/package/inheritance/:id', this.deleteInherit,
30                                               this.radiusSync,
31                                               this.replyclient);
32 };
33
34
35 /* Tpl */
36 PackageRoutes.prototype.getTplAll = function (req, res) {
37   var pkg      = new Package (req.app.config, 'template');
38   var query = pkg.query ();
39   var callback = 'callback';
40
41   query.asc ('name');
42   query.skip (req.query.$skip ? req.query.$skip : 0);
43
44   if (req.query.$top)
45     query.limit (req.query.$top);
46
47   if (req.query.callback)
48     callback = req.query.callback;
49
50   pkg.numRows (function (err, count) {
51     if (!err) {
52       query.exec (function (err, docs) {
53         if (!err) {
54           res.send(callback + '({ "results" : ' + JSON.stringify (docs) +
55                    ', "__count" : ' + count + ' });',
56                    {'Content-Type' : 'text/javascript'}, 200);
57         } else {
58           res.json (404);
59         }
60       });
61     } else {
62       res.json (404);
63     }
64   });
65 };
66
67 PackageRoutes.prototype.getTplSelectList = function (req, res) {
68   var pkg      = new Package (req.app.config, 'template');
69   var callback = 'callback';
70
71   var query = pkg.query ();
72
73   if (req.query.callback)
74     callback = req.query.callback;
75
76   query.asc ('name');
77
78   query.exec (function (err, docs) {
79     if (!err) {
80       var valpair = [];
81       docs.forEach (function (doc) {
82         var list = {};
83         list['key'] = doc._id;
84         list['label'] = doc.name + ': ' + doc.description;
85
86         valpair.push (list);
87       });
88
89       res.json (valpair);
90     } else {
91       res.json (404);
92     }
93   });
94
95 };
96
97 PackageRoutes.prototype.getTpl = function (req, res) {
98   var pkg      = new Package (req.app.config, 'template');
99
100   pkg.getById (req.params.id, function (err, doc) {
101     if (!err)
102       res.json (doc);
103     else
104       res.send (404);
105   });
106 };
107
108 PackageRoutes.prototype.addTpl = function (req, res, next) {
109   var pkg      = new Package (req.app.config, 'template');
110
111   if (req.body.pkgtype != undefined && req.body.pkgtype != 'template') {
112     res.send (400);
113     return;
114   }
115
116   pkg.addNew (req.body, function (err) {
117     if (!err) {
118       console.log ('Success:' + pkg.proc_model);
119       req.model = pkg.proc_model;
120       next ();
121     } else {
122       console.log ('Failed');
123       var test = new String(err);
124
125       if (test.search ('duplicate') >= 0)
126         res.send ('Save failed: Duplicate error', 404);
127       else
128         res.send ('Save failed: ' + err, 404);
129     }
130   });
131 };
132
133 PackageRoutes.prototype.updateTpl = function (req, res, next) {
134   var pkg      = new Package (req.app.config, 'template');
135
136   if (req.body.pkgtype != undefined && req.body.pkgtype != 'template') {
137     res.send (400); 
138     return;
139   }
140
141   pkg.update (req.params.id, req.body, function (err, numAffected, inherit) {
142     if (!err) {
143       console.log ('Update Success:', numAffected);
144
145       if (inherit) {
146
147         function syncAll (docs) {
148           var d = Q.defer ();
149
150           for (var key in docs) {
151             sync (docs[key]);
152           }
153
154           d.resolve ();
155           return d.promise;
156         }
157
158         function sync (doc) {
159           var d = Q.defer ();
160           var rspg = new RadiusSyncPg (req.app.config);
161           rspg.groupName (doc.name).attrsData (doc);
162
163           rspg.groupSync (doc.name, function (err, synced) {
164             d.resolve ();
165           });
166
167           return d.promise;
168         }
169
170         syncAll (inherit)
171           .then (function () {
172           
173           });
174
175       }
176       next ();
177     } else {
178       console.log ('Update Failed: ' + err);
179       res.send ('Update failed', 404);
180     }
181   });
182 };
183
184 PackageRoutes.prototype.deleteTpl = function (req, res, next) {
185   var pkg      = new Package (req.app.config, 'template');
186
187   pkg.remove (req.params.id, function (err, deps) {
188     if (err)
189       res.send ('Delete failed', 404);
190
191     if (deps) {
192       var dependency = '';
193       deps.forEach (function (doc) {
194         dependency += ' "' + doc.name + '"';
195       });
196       res.send ('Error dependency' + dependency, 404);
197       return;
198     }
199
200     next ();
201   });
202
203 };
204
205 /* Inherit */
206 PackageRoutes.prototype.getInheritAll = function (req, res) {
207   var pkg = new Package (req.app.config, 'inheritance');
208   var query = pkg.query ()
209   var callback = 'callback';
210
211   query.asc ('name');
212   query.skip (req.query.$skip ? req.query.$skip : 0);
213
214   if (req.query.$top)
215     query.limit (req.query.$top);
216
217   if (req.query.callback)
218     callback = req.query.callback;
219
220   pkg.numRows (function (err, count) {
221     if (!err) {
222       query.exec (function (err, docs) {
223         if (!err) {
224           res.send(callback + '({ "results" : ' + JSON.stringify (docs) +
225                    ', "__count" : ' + count + ' });',
226                    {'Content-Type' : 'text/javascript'}, 200);
227         } else {
228           res.json (404);
229         }
230       });
231     } else {
232       res.json (404);
233     }
234   });
235 };
236
237 PackageRoutes.prototype.getInherit = function (req, res) {
238   var pkg      = new Package (req.app.config, 'inheritance');
239
240   pkg.getById (req.params.id, function (err, doc) {
241     if (!err)
242       res.json (doc);
243     else
244       res.send (404);
245   });
246 };
247
248 PackageRoutes.prototype.addInherit = function (req, res, next) {
249   var pkg      = new Package (req.app.config, 'inheritance');
250
251   if (req.body.pkgtype != undefined && req.body.pkgtype != 'inheritance') {
252     res.send (400);
253     return;
254   }
255
256   pkg.addNew (req.body, function (err) {
257     if (!err) {
258       console.log ('Success:' + pkg.proc_model);
259       req.model = pkg.proc_model;
260       req.params.id = pkg.proc_model._id;
261       next ();
262     } else {
263       console.log ('Failed');
264       var test = new String (err);
265
266       if (test.search ('duplicate') >= 0)
267         res.send ('Save failed: Duplicate error', 404);
268       else
269         res.send ('Save failed: ' + err, 404);
270     }
271   });
272 };
273
274 PackageRoutes.prototype.updateInherit = function (req, res, next) {
275   var pkg = new Package (req.app.config, 'inheritance');
276
277   if (req.body.pkgtype != undefined && req.body.pkgtype != 'inheritance') {
278     res.send (400); 
279     return;
280   }
281
282   pkg.update (req.params.id, req.body,
283                       function (err, numAffected, prevdoc) {
284     if (err || numAffected <= 0) {
285       console.log ('Update Failed: ' + err);
286       res.send ('Update failed', 404);
287     }
288
289     req.prevDoc = prevdoc;
290     console.log ('Update Success: ' + numAffected);
291     next ();
292   });
293 };
294
295 PackageRoutes.prototype.deleteInherit = function (req, res, next) {
296   var pkg = new Package (req.app.config, 'inheritance');
297
298   pkg.remove (req.params.id, function (err, deps, docname) {
299     if (err)
300       res.send ('Delete failed', 404);
301
302     if (deps) {
303       var dependency = '';
304       deps.forEach (function (doc) {
305         dependency += ' "' + doc.name + '"';
306       });
307       res.send ('Error dependency' + dependency, 404);
308       return;
309     }
310
311     req.params.docname = docname;
312     next ();
313   });
314 };
315
316 PackageRoutes.prototype.radiusSync = function (req, res, next) {
317   console.log ('Start Sync');
318
319   function getData () {
320     var df = Q.defer ();
321     var pkg = new Package (req.app.config, 'inheritance');
322
323     pkg.model.findOne ({ _id: req.params.id }, function (err, doc) {
324       if (err) {
325         df.reject (err);
326         return;
327       }
328
329       df.resolve (doc);
330     });
331
332     return df.promise;
333   }
334
335   function sync (doc) {
336     var df = Q.defer (); 
337
338     var rspg = new RadiusSyncPg (req.app.config); 
339  
340     var name = doc ? doc.name : req.params.docname;
341
342     rspg.groupName (name);
343     if (doc)
344       rspg.attrsData (doc);
345     else
346       rspg.attrsData (undefined);
347
348     rspg.groupSync (name, function (err, synced) {
349       df.resolve ();
350     });
351
352     return df.promise;
353   }
354
355
356   switch (req.method) {
357     case 'POST':
358     case 'PUT':
359       var d = Q.defer ();
360
361       Q.fcall(getData)
362         .then (sync)
363         .then (function () {
364           next ();
365         })
366
367       return d.promise;
368
369     case 'DELETE':
370       var d = Q.defer ();
371
372       Q.fcall(sync)
373         .then (function () {
374           next ();
375         })
376
377       return d.promise;
378
379     default:
380       res.send (400);
381   }
382 };
383
384 PackageRoutes.prototype.replyclient = function (req, res) {
385   switch (req.method) {
386     case 'POST':
387       res.json ({ _id: req.model._id });
388       break;
389
390     case 'PUT':
391       res.send ('true', 200);
392       break;
393
394     case 'DELETE':
395       res.send ('true', 200);
396       break;
397
398     default:
399       res.send (400);
400   }
401 };
402
403 exports = module.exports = new PackageRoutes;