Built motion from commit 5e31ea4.|0.0.32
[motion.git] / server / api / mail_room / mail_room.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var util = require('util');
5
6 var User = require('../../models').User;
7 var Contact = require('../../models').Contact;
8 var MailRoom = require('../../models').MailRoom;
9 var MailMessage = require('../../models').MailMessage;
10 var MailAccount = require('../../models').MailAccount;
11 var MailAttachment = require('../../models').MailAttachment;
12
13 // Get list of mailRooms
14 exports.index = function (req, res, next) {
15   var attributes = ['subject', 'from', 'status'];
16   var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
17   var page = req.query.page ? parseInt(req.query.page, 10) : 0;
18
19   var query = {
20     where: {
21       $or: [{
22         status: 'NEW'
23       }, {
24         status: 'OPEN'
25       }]
26     },
27     include: [{
28       model: User,
29       attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
30     }, {
31       model: MailAccount
32     }],
33     limit: per_page,
34     offset: page * per_page
35   };
36
37   if (req.user.role === 'agent') {
38     query.include[0].where = {
39       id: req.user.id
40     }
41   }
42
43   _.forIn(req.query, function (value, key) {
44     switch (key) {
45     case 'per_page':
46     case 'page':
47       break;
48     case 'sort_by':
49       query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
50       break;
51     case 'sort_order':
52       break;
53     case '$':
54       query.where.$or = [];
55       attributes.forEach(function (attribute) {
56         var tmp = {};
57         tmp[attribute] = {
58           $like: '%' + value + '%'
59         };
60
61         query.where.$or.push(tmp);
62       });
63       break;
64     default:
65       query.where[key] = {
66         $like: {}
67       };
68       query.where[key].$like = '%' + value + '%';
69     }
70   });
71
72   console.log('query', query);
73
74
75   return MailRoom
76     .findAndCountAll(query)
77     .then(function (result) {
78       console.log(result);
79       var total_pages = Math.ceil(result.count / per_page);
80       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;
81       var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
82
83       res.status(200).send({
84         count: result.count,
85         mailRooms: result.rows,
86         next_page: next_page,
87         previous_page: previous_page,
88         total_pages: total_pages
89       });
90
91     })
92     .catch(function (err) {
93       return handleError(res, err);
94     });
95 };
96
97 // Get list of agent mailRooms
98 exports.agentIndex = function (req, res, next) {
99   return MailRoom
100     .findAll({
101       where: {
102         UserId: req.params.id
103       },
104       include: [{
105         all: true
106       }]
107     })
108     .then(function (mailRooms) {
109       return res.status(200).send(mailRooms);
110     })
111     .catch(function (err) {
112       return handleError(res, err);
113     });
114 };
115
116 // Get a single mailRoom
117 exports.show = function (req, res, next) {
118   return MailRoom
119     .findById(req.params.id, {
120       include: [{
121         model: MailMessage,
122         include: [{
123           model: MailAttachment
124         }, ]
125       }, {
126         model: MailAccount
127       }]
128     })
129     .then(function (mailRoom) {
130       if (!mailRoom) {
131         return res.sendStatus(404);
132       }
133
134       return res.send(mailRoom);
135     })
136     .catch(function (err) {
137       return handleError(res, err);
138     });
139 };
140
141 // Get a single mailRoom
142 exports.showAgents = function (req, res, next) {
143   return MailRoom
144     .findById(req.params.id)
145     .then(function (mailRoom) {
146       if (!mailRoom) {
147         return res.sendStatus(404);
148       }
149
150       return mailRoom
151         .getUsers({
152           attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
153         });
154     })
155     .then(function (users) {
156       return res.send(users);
157     })
158     .catch(function (err) {
159       return handleError(res, err);
160     });
161 };
162
163 // Creates a new mailRoom in the DB.
164 exports.create = function (req, res, next) {
165   return MailRoom
166     .create(req.body)
167     .then(function (mailRoom) {
168       return res.status(201).send(mailRoom);
169     })
170     .catch(function (err) {
171       return handleError(res, err);
172     });
173 };
174
175 // Updates an existing mailRoom in the DB.
176 exports.update = function (req, res, next) {
177   return MailRoom
178     .findById(req.params.id)
179     .then(function (mailRoom) {
180       if (!mailRoom) {
181         return res.sendStatus(404);
182       }
183       // CHECK IF MAIL IS ALREADY ASSIGNED
184       if (mailRoom.jobId) {
185         throw new Error('Mail already assigned');
186       }
187       var updated = _.merge(mailRoom, req.body);
188
189       return updated
190         .save();
191     })
192     .then(function (mailRoom) {
193       return res.status(200).send(mailRoom);
194     })
195     .catch(function (err) {
196       return handleError(res, err);
197     });
198 };
199
200 // Get a single mailRoom
201 exports.updateAgents = function (req, res, next) {
202   return MailRoom
203     .findById(req.params.id)
204     .then(function (mailRoom) {
205       if (!mailRoom) {
206         return res.sendStatus(404);
207       }
208
209       return mailRoom
210         .setUsers(req.body.agents);
211     })
212     .then(function () {
213       return res.sendStatus(200);
214     })
215     .catch(function (err) {
216       return handleError(res, err);
217     });
218 };
219
220 // Deletes a mailRoom from the DB.
221 exports.destroy = function (req, res, next) {
222   return MailRoom
223     .findById(req.params.id)
224     .then(function (mailRoom) {
225       if (!mailRoom) {
226         return res.sendStatus(404);
227       }
228       return mailRoom.destroy();
229     })
230     .then(function () {
231       return res.sendStatus(204);
232     })
233     .catch(function (err) {
234       return handleError(res, err);
235     });
236 };
237
238 // Deletes a agent from the DB.
239 exports.bulkDestroy = function (req, res) {
240   return MailRoom
241     .destroy({
242       where: {
243         id: req.query.id
244       },
245       individualHooks: true
246     })
247     .then(function () {
248       return res.sendStatus(200);
249     })
250     .catch(function (err) {
251       return handleError(res, err);
252     });
253 };
254
255 function handleError(res, err) {
256   return res.status(500).send(err);
257 }