Built motion from commit 5e31ea4.|0.0.32
[motion.git] / server / api / voice_queue / voice_queue.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var util = require('util');
5
6 var User = require('../../models').User;
7 var VoiceQueue = require('../../models').VoiceQueue;
8 var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
9 var VoiceExtension = require('../../models').VoiceExtension;
10
11 // Get list of voice_queues
12 exports.index = function(req, res) {
13   // console.log(req.query.page);
14   var attributes = ['name', 'description', 'strategy', 'context'];
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   VoiceQueue
54     .findAndCountAll(query)
55     .then(function(result) {
56       console.log(result.count);
57       var total_pages = Math.ceil(result.count / per_page);
58       console.log(total_pages);
59       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;
60       var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
61
62       res.status(200).send({
63         count: result.count,
64         rows: result.rows,
65         next_page: next_page,
66         previous_page: previous_page,
67         total_pages: total_pages
68       });
69
70     })
71     .catch(function(err) {
72       return handleError(res, err);
73     });
74 };
75
76 // Get a single voice_queue
77 exports.show = function(req, res) {
78   VoiceQueue
79     .findById(req.params.id)
80     .then(function(voice_queue) {
81       if (!voice_queue) {
82         return res.sendStatus(404);
83       }
84       return res.send(voice_queue);
85     })
86     .catch(function(err) {
87       return handleError(res, err);
88     });
89 };
90
91 // Validate the existence of a queue
92 exports.queueValidation = function(req, res) {
93   console.log(req.body);
94   VoiceQueue
95     .findAll({
96       where: {
97         name: req.body.name
98       }
99     })
100     .then(function(voice_queue) {
101       if (!voice_queue) {
102         return res.sendStatus(404);
103       }
104       return res.send(voice_queue);
105     })
106     .catch(function(err) {
107       return handleError(res, err);
108     });
109 };
110
111 // Creates a new voice_queue in the DB.
112 exports.create = function(req, res) {
113   VoiceQueue
114     .findAll({
115       where: {
116         name: req.body.name
117       }
118     })
119     .then(function(existingQueues) {
120       console.log(existingQueues);
121       console.log('Finding app row.....');
122       if (!existingQueues) {
123         return res.sendStatus(404);
124       }
125       if (existingQueues.length > 0) {
126         return res.status(500).send({
127           message: 'MESSAGE_EXIST_QUEUE'
128         });
129       }
130       VoiceQueue
131         .create(req.body)
132         .then(function(voice_queue) {
133           return res.status(201).send(voice_queue);
134         })
135         .catch(function(err) {
136           return handleError(res, err);
137         });
138     })
139     .catch(function(err) {
140       return handleError(res, err);
141     });
142 };
143
144 // Updates an existing voice_queue in the DB.
145 exports.update = function(req, res) {
146   VoiceQueue
147     .find({
148       where: {
149         name: req.params.id
150       }
151     })
152     .then(function(voiceQueue) {
153       if (!voiceQueue) {
154         return res.sendStatus(404);
155       }
156       if (req.body.id) {
157         delete req.body.id;
158       }
159       var updated = _.merge(voiceQueue, req.body);
160       updated.save()
161         .then(function() {
162           return res.status(200).send(voiceQueue);
163         })
164         .catch(function(err) {
165           return handleError(res, err);
166         });
167     })
168     .catch(function(err) {
169       return handleError(res, err);
170     });
171 };
172
173
174 // Updates an existing user_has_voiceQueue in the DB.
175 exports.addAgents = function(req, res, next) {
176
177   console.log('addAgents');
178   console.log(req.params);
179   console.log(req.body);
180   User
181     .findAll({
182       where: {
183         id: {
184           $in: req.body.agents
185         }
186       }
187     })
188     .then(function(users) {
189       // console.log(users);
190       var userHasVoiceQueues = _.map(users, function(user) {
191         return {
192           queue: req.params.id,
193           location: util.format('SIP/%s', user.name),
194           membername: user.name,
195           VoiceQueueName: req.params.id,
196           UserId: user.id
197         };
198       });
199
200       UserHasVoiceQueue
201         .bulkCreate(userHasVoiceQueues, {
202           individualHooks: true
203         })
204         .then(function() {
205           return res.sendStatus(200);
206         })
207         .catch(function(err) {
208           return next(err);
209         });
210     })
211     .catch(function(err) {
212       return next(err);
213     });
214 };
215
216 exports.removeAgents = function(req, res, next) {
217   VoiceQueue
218     .find({
219       where: {
220         name: req.params.id
221       }
222     })
223     .then(function(voiceQueue) {
224       if (voiceQueue) {
225         // QUEUE FOUND
226         // REMOVE AGENTS
227         voiceQueue
228           .removeUsers(req.body.agents, {
229             individualHooks: true
230           })
231           .then(function() {
232             return res.sendStatus(200);
233           })
234           .catch(function(err) {
235             return next(err);
236           });
237       } else {
238         return next(new Error('no queue found'));
239       }
240     })
241     .catch(function(err) {
242       return next(err);
243     });
244 };
245
246 // Deletes a voice_queue from the DB.
247 exports.destroy = function(req, res) {
248   VoiceQueue
249     .find({
250       where: {
251         name: req.params.name
252       }
253     })
254     .then(function(voice_queue) {
255       if (!voice_queue) {
256         return res.sendStatus(404);
257       }
258       VoiceExtension
259         .findAll({
260           where: {
261             queue: voice_queue.name
262           }
263         })
264         .then(function(contextExtensions) {
265           if (contextExtensions.length > 0) {
266             return res.status(500).send({
267               message: 'MESSAGE_QUEUE_ROUTE_ASSOCIATED'
268             });
269           }
270           voice_queue.destroy()
271             .then(function() {
272               return res.sendStatus(204);
273             })
274             .catch(function(err) {
275               return handleError(res, err);
276             });
277         })
278         .catch(function(err) {
279           return handleError(res, err);
280         });
281     })
282     .catch(function(err) {
283       return handleError(res, err);
284     });
285 };
286
287 // Deletes multiple voice_queues from the DB.
288 exports.bulkDestroy = function(req, res) {
289   VoiceQueue
290     .findAll({
291       where: {
292         name: req.query.name
293       }
294     })
295     .then(function(voice_queues) {
296       if (!voice_queues) {
297         return res.sendStatus(404);
298       }
299       var destroyQueuesNames = _.pluck(_.pluck(voice_queues, 'dataValues'), 'name');
300       console.log(destroyQueuesNames);
301       VoiceExtension
302         .findAll({
303           where: {
304             queue: destroyQueuesNames
305           }
306         })
307         .then(function(contextExtensions) {
308           if (contextExtensions.length > 0) {
309             return res.status(500).send({
310               message: 'MESSAGE_QUEUE_ROUTE_ASSOCIATED'
311             });
312           }
313           VoiceQueue
314             .destroy({
315               where: {
316                 name: req.query.name
317               },
318               individualHooks: true
319             })
320             .then(function() {
321               return res.sendStatus(204);
322             })
323             .catch(function(err) {
324               return handleError(res, err);
325             });
326         })
327         .catch(function(err) {
328           return handleError(res, err);
329         });
330     })
331     .catch(function(err) {
332       return handleError(res, err);
333     });
334 };
335
336
337 function handleError(res, err) {
338   return res.status(500).send(err);
339 }