Built motion from commit 5e31ea4.|0.0.32
[motion.git] / server / api / service / service.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var util = require('util');
5
6 var User = require('../../models').User;
7 var Service = require('../../models').Service;
8 var UserHasService = require('../../models').UserHasService;
9 var CustomField = require('../../models').CustomField;
10 var Contact = require('../../models').Contact;
11
12 // Get list of services
13 exports.index = function(req, res) {
14   var attributes = ['name', 'description'];
15   var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
16   var page = req.query.page ? parseInt(req.query.page, 10) : 0;
17
18   var query = {
19     where: {},
20     limit: per_page,
21     offset: page * per_page
22   };
23
24   _.forIn(req.query, function(value, key) {
25     switch (key) {
26       case 'per_page':
27       case 'page':
28         break;
29       case 'sort_by':
30         query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
31         break;
32       case 'sort_order':
33         break;
34       case '$':
35         query.where.$or = [];
36         attributes.forEach(function(attribute) {
37           var tmp = {};
38           tmp[attribute] = {
39             $like: '%' + value + '%'
40           };
41
42           query.where.$or.push(tmp);
43         });
44         break;
45       default:
46         query.where[key] = {
47           $like: {}
48         };
49         query.where[key].$like = '%' + value + '%';
50     }
51   });
52
53   Service
54   // .scope('customFields')
55     .findAndCountAll(query)
56     .then(function(result) {
57       console.log(result.count);
58       var total_pages = Math.ceil(result.count / per_page);
59       console.log(total_pages);
60       var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
61       var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
62
63       res.status(200).send({
64         count: result.count,
65         rows: result.rows,
66         next_page: next_page,
67         previous_page: previous_page,
68         total_pages: total_pages
69       });
70
71     })
72     .catch(function(err) {
73       return handleError(res, err);
74     });
75 };
76
77 // Get all custom_fields
78 exports.getCustomFields = function(req, res) {
79   CustomField
80     .findAll({
81       where: {
82         ServiceId: req.params.id,
83         active: true
84       }
85     })
86     .then(function(customFields) {
87       return res.status(200).send(customFields);
88     })
89     .catch(function(err) {
90       console.log(err);
91       return handleError(res, err);
92     });
93 };
94
95 exports.showCustomField = function(req, res) {
96   CustomField
97     .findById(req.params.id)
98     .then(function(customField) {
99       if (!customField) {
100         return res.sendStatus(404);
101       }
102       return res.send(customField);
103     })
104     .catch(function(err) {
105       return handleError(res, err);
106     });
107 };
108
109 exports.updateCustomField = function(req, res) {
110   CustomField
111     .findAll({
112       where: {
113         name: req.body.name,
114         id: {
115           $ne: req.body.id
116         }
117       }
118     })
119     .then(function(customFields) {
120       if (!customFields) {
121         return res.sendStatus(404);
122       }
123       if (customFields.length > 0) {
124         return res.status(500).send({
125           message: 'MESSAGE_EXIST_CUSTOM_FIELD'
126         })
127       }
128       if (req.body.id) {
129         delete req.body.id;
130       }
131       CustomField
132         .findById(req.params.id)
133         .then(function(customField) {
134           if (!customField) {
135             return res.sendStatus(404);
136           }
137           var updated = _.merge(customField, req.body);
138           updated.save()
139             .then(function() {
140               return res.status(200).send(customField);
141             })
142             .catch(function(err) {
143               return handleError(res, err);
144             });
145         })
146         .catch(function(err) {
147           return handleError(res, err);
148         });
149     })
150     .catch(function(err) {
151       return handleError(res, err);
152     });
153 };
154
155 exports.createCustomField = function(req, res) {
156   req.body.ServiceId = req.params.id;
157   CustomField
158     .create(req.body)
159     .then(function(customField) {
160       return res.status(201).send(customField);
161     })
162     .catch(function(err) {
163       return handleError(res, err);
164     });
165 };
166
167 // Get a single service
168 exports.show = function(req, res) {
169   Service
170     .findById(req.params.id)
171     .then(function(service) {
172       if (!service) {
173         return res.sendStatus(404);
174       }
175       return res.send(service);
176     })
177     .catch(function(err) {
178       return handleError(res, err);
179     });
180 };
181
182 // Validate the existence of a service
183 exports.serviceValidation = function(req, res) {
184   console.log(req.body);
185   Service
186     .findAll({
187       where: {
188         id: req.body.id
189       }
190     })
191     .then(function(service) {
192       if (!service) {
193         return res.sendStatus(404);
194       }
195       return res.send(service);
196     })
197     .catch(function(err) {
198       return handleError(res, err);
199     });
200 };
201
202 // Creates a new service in the DB.
203 exports.create = function(req, res) {
204   Service
205     .findAll({
206       where: {
207         name: req.body.name
208       }
209     })
210     .then(function(existingServices) {
211       console.log(existingServices);
212       console.log('Finding app row.....');
213       if (!existingServices) {
214         return res.sendStatus(404);
215       }
216       if (existingServices.length > 0) {
217         return res.status(500).send({
218           message: 'MESSAGE_EXIST_SERVICE'
219         });
220       }
221       Service
222         .create(req.body)
223         .then(function(service) {
224           return res.status(201).send(service);
225         })
226         .catch(function(err) {
227           return handleError(res, err);
228         });
229     })
230     .catch(function(err) {
231       return handleError(res, err);
232     });
233 };
234
235 // Updates an existing service in the DB.
236 exports.update = function(req, res) {
237   Service
238     .findAll({
239       where: {
240         name: req.body.name
241       }
242     })
243     .then(function(existingServices) {
244       console.log(existingServices);
245       console.log('Finding app row.....');
246       if (!existingServices) {
247         return res.sendStatus(404);
248       }
249       if (existingServices.length > 0) {
250         return res.status(500).send({
251           message: 'MESSAGE_EXIST_SERVICE'
252         });
253       }
254       return Service
255         .findById(req.params.id);
256     })
257     .then(function(service) {
258       if (!service) {
259         return res.sendStatus(404);
260       }
261       if (req.body.id) {
262         delete req.body.id;
263       }
264       var updated = _.merge(service, req.body);
265       return updated.save();
266     })
267     .then(function(service) {
268       return res.status(200).send(service);
269     })
270     .catch(function(err) {
271       return handleError(res, err);
272     });
273 };
274
275
276 // Updates an existing user_has_service in the DB.
277 exports.addAgents = function(req, res, next) {
278
279   console.log('addAgents');
280   console.log(req.params);
281   console.log(req.body);
282   User
283     .findAll({
284       where: {
285         id: {
286           $in: req.body.agents
287         }
288       }
289     })
290     .then(function(users) {
291       // console.log(users);
292       var userHasServices = _.map(users, function(user) {
293         return {
294           service: req.params.id,
295           membername: user.name,
296           UserId: user.id
297         };
298       });
299
300       UserHasService
301         .bulkCreate(userHasServices, {
302           individualHooks: true
303         })
304         .then(function() {
305           return res.sendStatus(200);
306         })
307         .catch(function(err) {
308           return next(err);
309         });
310     })
311     .catch(function(err) {
312       return next(err);
313     });
314 };
315
316 exports.removeAgents = function(req, res, next) {
317   Service
318     .find({
319       where: {
320         id: req.params.id
321       }
322     })
323     .then(function(service) {
324       if (service) {
325         // SERVICE FOUND
326         // REMOVE AGENTS
327         service
328           .removeUsers(req.body.agents, {
329             individualHooks: true
330           })
331           .then(function() {
332             return res.sendStatus(200);
333           })
334           .catch(function(err) {
335             return next(err);
336           });
337       } else {
338         return next(new Error('no service found'));
339       }
340     })
341     .catch(function(err) {
342       return next(err);
343     });
344 };
345
346 // Deletes a service from the DB.
347 exports.destroy = function(req, res) {
348   destroyService(req.params.id, res);
349 };
350
351 // Deletes multiple services from the DB.
352 exports.bulkDestroy = function(req, res) { //add the check for associated contacts
353   destroyService(req.query.id, res);
354 };
355
356 function destroyService(id, res) {
357   return delOrUpdateCf(id)
358     .all()
359     .then(function() {
360       return Service.destroy({
361         where: {
362           id: id
363         },
364         individualHooks: true
365       });
366     })
367     .then(function() {
368       return res.sendStatus(204);
369     })
370     .catch(function(err) {
371       console.log(err);
372       return handleError(res, err);
373     });
374 }
375
376 function delOrUpdateCf(id) {
377   return CustomField.findAll({
378       where: {
379         ServiceId: id
380       },
381       include: [{
382         model: Contact
383       }]
384     })
385     .then(function(customFields) {
386       console.log(customFields.length);
387       var delOrDeact = [];
388       _.forEach(customFields, function(elem) {
389         if (elem.Contacts.length) {
390           delOrDeact.push(elem.update({
391             active: false
392           }));
393         } else {
394           delOrDeact.push(elem.destroy());
395         }
396       });
397       return delOrDeact;
398     })
399 }
400
401 exports.deactivateCustomField = function(req, res) {
402   CustomField
403     .findById(req.params.id, {
404       include: [{
405         model: Contact
406       }]
407     })
408     .then(function(customField) {
409       if (!customField) {
410         return res.sendStatus(404);
411       }
412       if (customField.Contacts.length) {
413         return customField.update({
414           active: false
415         });
416       } else {
417         return customField.destroy();
418       }
419     })
420     .then(function() {
421       return res.sendStatus(204);
422     })
423     .catch(function(err) {
424       return handleError(res, err);
425     });
426 };
427
428
429 function handleError(res, err) {
430   return res.status(500).send(err);
431 }